2013-04-08 31 views
3

我正在研究Django中的項目。正確使用Django assignment_tag內置標記

今天早些時候,我發現了新的(Django> = 1.4)assignment_tag。我立即決定,這正是我所需要的東西,並將一些邏輯投入到對數據庫執行一個非常簡單的查詢並返回結果查詢集的邏輯中。我包裝的函數帶有一個參數,該參數允許調用上下文指定在使用模板標籤時直接在模板中獲取多少個結果。

這很方便 - 我不必更新我的視圖,當我決定這個清單應該有5個項目,而不是3 - 但它似乎是我們不應該踩的那些灰色區域之一(即在編寫良好的,可維護的Django代碼時將應用程序邏輯推入模板)。

現在,從編寫代碼分離幾個小時,我想知道是否應該完全取消assign_tag。

代碼:

models.py

class SomeObject(models.Model): 
    is_active = models.BooleanField(default=False) 
    (...) 

templatetags/myapp_tags.py

from django import template 
from myapp.models import SomeObject 

register = template.Library() 

@register.assignment_tag 
def get_someobjects_list(max_results=0): 
    queryset = SomeObject.objects.filter(is_active=True) 
    if max_results == 0: 
     return queryset 
    elif max_results > 0: 
     return queryset[:min(max_results, queryset.count())] 
    else: 
     return None 

模板/ MYAPP /塊/ someobject_list.html

{% load myapp_tags %} 

{% get_someobjects_list as someobjects_list %} 
# or {% get_some_objects_list 5 as someobjects_list %} ... flexible! 
{% if someobjects_list %} 
<ul> 
    {% for someobject in someobjects_list %} 
    <li> 
    <a href="{{ someobject.get_absolute_url }}"> 
     {{ someobject.name }} 
    </a> 
    </li> 
    {% endfor %} 
</ul> 
{% else %} 
<span>No someobjects exist</span> 
{% endif %} 

我非常興奮地發現這些存在 - 這對我來說在這個特殊情況下很方便。現在,我對尋找新功能的興奮已經過去了,似乎很清楚我正在濫用它。在Django文檔中給出的例子看起來像是一個更好的應用 - 抓住當前日期時間的字符串表示,這不需要數據庫查詢。我擔心的是,如果我經常開始使用這種模式,我會讓自己心痛。一路下滑之後:我最終甚至不打擾將上下文傳遞給我的模板,並且我的所有數據庫查詢都將隱藏在模板標籤中,沒有人會想到它們。

看來代碼會更乾淨,如果我只是拋出了我發現assignment_tags並創建自定義模型管理器時的整個「好主意」。

有沒有其他乾淨的方式來完成這個,我失蹤了?在Django開發人員中,經理方法是達成共識的最佳方式嗎?

+0

在這種情況下,我會讓你的視圖存儲'someobjects_list'到你的上下文中 - 然後你不需要templatetag,並且你的查詢將會生活在某個有意義的地方(無論是在你的視圖還是在你的模型中在自定義管理器上)。 – girasquid 2013-05-28 17:18:31

回答

1

如果您需要爲網站的幾個頁面獲取一些信息到模板上下文中,但不希望(或不能)將信息放入網站上的每個視圖中,則賦值模板標記尤其有用,並且不想或不能依賴上下文處理器。

他們基本上保證您的信息將在模板中可用。