Django自定义模板标签:首选渲染模板或填充上下文?

时间:2014-03-29 16:13:32

标签: django django-templates

我一直在寻找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 %}

1 个答案:

答案 0 :(得分:1)

第二个是很差的练习。 Django有一种内置的方法来从标签中呈现模板:使用inclusion tag。你绝对应该这样做而不是自己渲染模板。

实际上,Django现在也有一种在上下文中设置变量的内置方法:assignment tags。再次,你应该使用它。我想在8年来我一直在使用Django我可能会编写一个完整的Node类/标记函数,而不是使用装饰器快捷方式的数百个函数。

至于你应该使用哪种,它在很大程度上取决于你想要达到的目标。但我会说,在上下文中设置变量只是为了在包含中使用它们似乎非常奇怪:再次,完全包含标记的用途。

相关问题