2011-10-31 35 views
8

讓我們對於我的同胞們來說非常簡單(?)。你可以製作一個返回查詢集的自定義模板標籤嗎?如果是,如何? - Django

這是自定義的模板標籤如何正常工作 -

模板 - >

{% block content %} 

    blah blah blah 

    {% custom_tag_load %} 

{% endblock %} 

的custom_tag_load被調用,它返回一個字符串。我想返回一個查詢集這我可能用這樣的 - >

{% block content %} 

    blah blah blah 

    {% for x in custom_tag_load %} 

      {{ x.datetime }} 

    {% endfor %} 

{% endblock %} 

說明 - >什麼基本上,我試圖做的是避免經過查詢集通過視圖,我不確定我是否應該在我的全局上下文中存儲查詢集。

+0

這有點打敗了MVC的全部觀點。這是一個有趣的問題,但總的來說,視圖層永遠不應該直接從數據庫中獲取數據。不過,+1對於一個有趣的問題。 –

+1

@Chris,那真的不是真的。你不想從模板中的數據庫中獲取你的核心對象,但是輔助的東西 - 例如最近的帖子的側邊欄 - 在模板標籤中非常有意義。 –

回答

5

您可以從標籤返回任何您喜歡的東西,包括查詢集。但是,您不能在for標記內使用標記 - 您只能在那裏使用變量(或通過過濾器傳遞的變量)。你可以做的是讓你的標籤把查詢集放入上下文中的變量中,並在for循環中使用該變量。請參閱how to set a variable from a tag上的文檔 - 雖然請注意開發版本爲has an easier method

但是,您不應該擔心將查詢集放入上下文處理器中。不要忘記,查詢集是懶惰的,所以除非在模板中對查詢集進行評估或迭代,否則不會產生數據庫命中。

+2

啊,這是有道理的。爲什麼好的東西總是在開發版本? FML – Sussagittikasusa

+0

我有同樣的問題,但答案沒有多大幫助。這很難理解,並且鏈接不起作用。 – HBat

+0

對於無法理解此答案的人,請查看[THIS](http://stackoverflow.com/a/12897324/2275286)以創建上下文變量。 – HBat

2

模板標籤可以做任何你想要的。從你的僞代碼,你可以完成你需要用包含標籤的內容:

#my_tags.py 
from django import template 
from my_app.models import MyModel 

register = template.Library() 

@register.inclusion_tag('my_template.html') 
def my_custom_tag(): 
    things = MyModel.objects.all() 
    return {'things' : things} 


#my_template.html 
{% if things %} 
    <ul> 
    {% for thing in things %} 
     <li>{{ thing }}</li>  
    {% empty %} 
     <li>Sorry, no things yet.</li> 
    {% endfor %} 
    </ul> 
{% endif %} 


#the_view.html 
{% load my_tags %} 

{% my_custom_tag %} 

或者,你可以寫一個自定義標籤,增加了一個查詢集上下文。希望能幫助你。

+3

嘿布蘭登,這正是我想要避免的那種事情,我不希望「my_template.html」在「the_view.html」之外。感謝您的回覆。 – Sussagittikasusa

相關問題