我一直在寻找Django自定义模板标签的示例,我注意到很多都在上下文中设置了一些值,而不是渲染模板。
哪一个是更好的做法?
我将向您展示这两个例子。 在第一个中,templatetags/entry_extras.py
填充ContextNode
渲染方法中的上下文。在模板文件中,它加载调用last_entries标记的上下文,然后加载includes
部分模板。
extry_extras.py 的
class ContextNode(template.Node):
def render(self, context):
stream = BlogEntry.objects.all()[1:5]
context['last_entries'] = stream
return ''
@register.tag(name="last_entries")
def get_last_entries(parser, token):
return ContextNode()
mytemplate.html
...
{% load entry_extras %}
{% last_entries %}
{% include 'last_entries_widget.html' with last_entries=last_entries %}
在第二个示例中,template_tag呈现模板本身,因此在 mytemplate.html 中调用标记足以显示小部件。
extry_extras.py 的
class ContextNode(template.Node):
def render(self, context):
stream = BlogEntry.objects.all()[1:5]
return render_to_string('last_entries_widget.html',
{'last_entries': stream},
context)
@register.tag(name="last_entries")
def get_last_entries(parser, token):
return ContextNode()
mytemplate.html
...
{% load entry_extras %}
{% last_entries %}
答案 0 :(得分:1)
第二个是很差的练习。 Django有一种内置的方法来从标签中呈现模板:使用inclusion tag。你绝对应该这样做而不是自己渲染模板。
实际上,Django现在也有一种在上下文中设置变量的内置方法:assignment tags。再次,你应该使用它。我想在8年来我一直在使用Django我可能会编写一个完整的Node类/标记函数,而不是使用装饰器快捷方式的数百个函数。
至于你应该使用哪种,它在很大程度上取决于你想要达到的目标。但我会说,在上下文中设置变量只是为了在包含中使用它们似乎非常奇怪:再次,完全包含标记的用途。