Django中的`@stringfilter`是什么?

r7xajy2e  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(83)

我有时会看到@stringfilter带有@ register. filter。
所以,我用@stringfilter创建了test过滤器,如下所示:

# "templatetags/custom_tags.py"

from django.template import Library
from django.template.defaultfilters import stringfilter

register = Library()

@register.filter(name="test")
@stringfilter # Here
def test_filter(num1, num2):
    return

但是,它接受int类型值而没有错误,如下所示:

# "templates/index.html"

{% load custom_tags %}

{{ 3|test:7 }} # Here

我认为@stringfilter只接受str类型的值,而其他类型的值会出错。
Django中的@stringfilter是什么?

2izufjch

2izufjch1#

@stringfilter可以将第一个参数(parameter)转换为str类型。
下面是关于@stringfilter的文章:
如果您正在编写一个只需要字符串作为第一个参数的模板过滤器,则应该使用装饰器stringfilter。这将在传递给函数之前将对象转换为它的字符串值
例如,将第一个参数3和第二个参数7传递给test过滤器,如下所示:

# "templates/index.html"

{% load custom_tags %}

{{ 3|test:7 }} # Here

然后,只有第一个参数num1str类型,如下所示:

# "templatetags/custom_tags.py"

@register.filter(name="test")
@stringfilter # Here
def test_filter(num1, num2):
    print(type(num1), type(num2)) # <class 'str'> <class 'int'>
    return

请注意,如果@stringfilter和@register.filter的顺序相反,则第一个参数不会转换为str类型,如下所示:

# "templatetags/custom_tags.py"

@stringfilter # Here
@register.filter(name="test") # Here
def test_filter(num1, num2):
    print(type(num1), type(num2)) # <class 'int'> <class 'int'>
    return

此外,您可以将@stringfilter与@register.simple_tag、@register.tag或@register.inclusion_tag一起使用,如下所示。* 如果@stringfilter@register.simple_tag@register.tag@register.inclusion_tag的顺序相反,则第1个参数不转换为str类型:

# "templatetags/custom_tags.py"

@register.simple_tag(name="test")
@stringfilter
def test_tag(num1, num2):
    print(type(num1), type(num2)) # <class 'str'> <class 'int'>
    return
# "templatetags/custom_tags.py"

@register.tag(name="test")
@stringfilter
def test_tag(parser, token):
    print(type(parser), type(token)) # <class 'str'> <class 'django.template.base.Token'>
    return PersonNode()

class PersonNode(Node):
    def render(self, context):
        return ""
# "templatetags/custom_tags.py"

@register.inclusion_tag(name='test', filename='result.html')
@stringfilter
def test_tag(num1, num2):
    print(type(num1), type(num2)) # <class 'str'> <class 'int'>
    return

相关问题