您可以使用@register.simple_tag存储上下文变量,该变量返回简单数据而不是返回基于Node
类的复杂对象,如下所示:
from django.template import Library
register = Library()
@register.simple_tag(takes_context=True)
def person(context):
context["name"] = "John"
context["age"] = 36
return ""
# "index.html"
{% load custom_tags %}
{% person %}
{{ name }} {{ age }}
输出:
John 36
此外,您可以使用
as
参数将从
@register.simple_tag
的
person()
返回的值存储到
person_info
中,如下所示:
@register.simple_tag(takes_context=True)
def person(context):
return "John 36"
# "index.html"
{% load custom_tags %}
{% person as person_info %}
{{ person_info }}
输出:
John 36
而且,您可以使用@register.tag存储上下文变量,该变量返回一个基于Node
(类)的复杂对象,如下所示。*如果@register.tag
不能接受takes_context
参数,则会出现错误,并且无法与as
参数一起使用:
from django.template import Library, Node
register = Library()
@register.tag
def person(parser, token):
return PersonNode()
class PersonNode(Node):
def __init__(self):
pass
def render(self, context):
context["name"] = "John"
context["age"] = 36
return ""
# "index.html"
{% load custom_tags %}
{% person %}
{{ name }} {{ age }}
输出:
John 36
assignment_tag
,它类似于simple_tag
但实现了as variablename
功能:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#assignment-tags - Jordan Reiterassignment_tag
。 很好。给未来的读者更新一下:assignment_tag
可在 Django 版本>= 1.4 中使用(我假设在上面的评论时还在开发中)。 - chucksmashsimple_tag
的结果,而assignment_tag
正在被弃用。 - mehmet