2014-03-29 25 views
1

我一直在尋找Django自定義模板標籤的例子,我注意到很多人在上下文中設置了一些值而不是渲染模板。Django自定義模板標籤:首選呈現模板還是填充上下文?

哪一個更好?

我會告訴你兩個例子。 在第一個,templatetags/entry_extras.py填充ContextNode的渲染方法中的上下文。在模板文件中,它加載調用last_entries標記的上下文,然後加載部分模板。

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

這第二個是實踐很差。 Django有一種內置的方式來從一個標記中呈現模板:使用inclusion tag。你絕對應該這樣做,而不是自己渲染模板。

實際上,Django現在在上下文中有一個內置的變量設置方法:assignment tags。再一次,你應該使用這個。我認爲在我使用Django的8年中,我可能只寫了一次完整的Node類/標記函數,而不是使用裝飾器快捷方式的數百個函數。

至於你應該使用哪一種,它非常依賴於你想要達到的目標。但是,我會說,在上下文中設置變量只是將它們用在include中似乎很奇怪:再次,這就是,正好是包含標籤的用途。