当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django Library.simple_tag用法及代码示例


本文介绍 django.template.Library.simple_tag 的用法。

声明

django.template.Library.simple_tag()

许多模板标签采用许多参数 - 字符串或模板变量 - 并在仅基于输入参数和一些外部信息进行一些处理后返回结果。例如,current_time 标记可能接受格式字符串并将时间作为相应格式的字符串返回。

为了简化这些类型的标签的创建,Django 提供了一个辅助函数 simple_tag 。该函数是 django.template.Library 的一个方法,它接受一个接受任意数量参数的函数,将其包装在 render 函数和上面提到的其他必要位中,并将其注册到模板系统中。

因此,我们的current_time 函数可以这样编写:

import datetime
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
    return datetime.datetime.now().strftime(format_string)

关于 simple_tag 辅助函数的一些注意事项:

  • 在调用我们的函数时已经检查了所需的参数数量等,因此我们不需要这样做。
  • 参数周围的引号(如果有的话)已经被去掉了,所以我们收到一个纯字符串。
  • 如果参数是模板变量,我们的函数将传递变量的当前值,而不是变量本身。

与其他标记实用程序不同,如果模板上下文处于自动转义模式,simple_tag 将通过 conditional_escape() 传递其输出,以确保正确的 HTML 并保护您免受 XSS 漏洞的侵害。

如果不需要额外的转义,如果您绝对确定您的代码不包含 XSS 漏洞,则需要使用 mark_safe() 。对于构建小的 HTML 片段,强烈建议使用 format_html() 而不是 mark_safe()

如果您的模板标签需要访问当前上下文,您可以在注册标签时使用takes_context 参数:

@register.simple_tag(takes_context=True)
def current_time(context, format_string):
    timezone = context['timezone']
    return your_get_current_time_method(timezone, format_string)

请注意,第一个参数 must 被称为 context

有关 takes_context 选项如何工作的更多信息,请参阅包含标记部分。

如果您需要重命名标签,可以为其提供自定义名称:

register.simple_tag(lambda x: x - 1, name='minusone')

@register.simple_tag(name='minustwo')
def some_function(value):
    return value - 2

simple_tag 函数可以接受任意数量的位置或关键字参数。例如:

@register.simple_tag
def my_tag(a, b, *args, **kwargs):
    warning = kwargs['warning']
    profile = kwargs['profile']
    ...
    return ...

然后在模板中,可以将任意数量的以空格分隔的参数传递给模板标签。与 Python 一样,关键字参数的值使用等号(“=”)设置,并且必须在位置参数之后提供。例如:

{% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile %}

可以将标记结果存储在模板变量中,而不是直接输出。这是通过使用as 参数后跟变量名来完成的。这样做可以让您自己输出您认为合适的内容:

{% current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.template.Library.simple_tag。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。