2011-03-23 51 views
5

我明白,在Django中,模板語言是故意中性的,以防止顯示代碼中的計算過多。這意味着,理想情況下,對於用戶可能會被迫進行計算的每種情況,都有一個更合適的選擇。無論是標籤還是過濾器都可以實現,或者希望在視圖中簡單明瞭。任何不適合的煩惱都很少見。由於Django不鼓勵將參數傳遞給模板中的函數,因此鼓勵什麼呢?

但是我發現了一個相當煩人的常見情況,Django有更好的方法來做到這一點,我沒有想到,或者他們應該看到這裏的光線,並將線條移動一點點在不久的將來版本中的模板內計算(例如,如果他們使用if語句參數):

我有一個項目的查詢集。我需要以某種方式顯示它們,但是我顯示的內容不僅取決於對象的狀態,還取決於其他獨立的事物(通常是登錄的人)。因此,向該模型添加一個函數將無濟於事。

到目前爲止,我一直在做的是將查詢集轉換爲列表或樹結構(取決於任務),併爲每個查詢添加一個「view_extra」屬性。 view_extra是一個字典,我通常堅持取決於誰登錄的東西。除了一個麻煩之外,它也破壞了查詢集的懶惰。我想我可以去做一個生成器,但顯然這並不是Django開發人員想到的。

我應該更多地嘗試queryset註釋,但我不知道如何在一些更復雜的情況下工作。另外,在樹或list-list-list結構場景(包含成員的項目的查詢集是我需要迭代的更多查詢集)中沒有用。

我可以註冊一個過濾器(如這裏建議的django template system, calling a function inside a model),但這是濫用過濾器,對吧?它們旨在改變文本和數據,而不是爲了開發人員故意讓我們不要做的事情的特定目的替代品。

任何「正確」的方式來做到這一點,我不知道?我是否建議這是Django模板系統的缺陷?

回答

2

也許Jinja templates是在這種情況下使用Django的模板系統的一個很好的選擇。除了Jinja允許您在模板中使用某種級別的邏輯的重要事實之外,Jinja模板和Django模板幾乎完全相同。

這個直接來自Jinja文檔的示例代碼看起來可能是您嘗試實現的一種東西。

{% for comment in models.comments.latest(10) %} 
    ... 
{% endfor %} 

要神社Django的整合,你可以看看Coffin

4

我不明白爲什麼創建一個自定義標籤和過濾器是一種「虐待」。就我而言,這正是他們的目標,我一直在使用它們。

+0

+1我同意。我剛剛開始使用Django模板進行一個側面項目(我使用Mako作爲我的主項目),雖然在某些情況下我覺得它很麻煩,但註冊標籤並不是那麼困難。您正在將邏輯移入「代碼」區域,並將其從顯示邏輯中移除。 – 2011-03-23 08:44:14

+0

但是在那一點上,他們爲什麼不讓你傳遞參數給任何成員函數呢?他們只是讓它更加麻煩,以防止我們做得太多? – orblivion 2011-03-23 14:16:09

+1

我不會稱之爲濫用,但我同意@orblivion在這一個。創建一個自定義標籤或過濾器可能是對這個問題的推薦答案,但大多數情況下它只是引入不需要的間接。你的模板仍然有一個方法調用,它仍然傳遞一個參數。唯一的區別是你不得不寫一箇中間人。 – poswald 2011-05-26 16:13:30