我明白,在Django中,模板語言是故意中性的,以防止顯示代碼中的計算過多。這意味着,理想情況下,對於用戶可能會被迫進行計算的每種情況,都有一個更合適的選擇。無論是標籤還是過濾器都可以實現,或者希望在視圖中簡單明瞭。任何不適合的煩惱都很少見。由於Django不鼓勵將參數傳遞給模板中的函數,因此鼓勵什麼呢?
但是我發現了一個相當煩人的常見情況,Django有更好的方法來做到這一點,我沒有想到,或者他們應該看到這裏的光線,並將線條移動一點點在不久的將來版本中的模板內計算(例如,如果他們使用if語句參數):
我有一個項目的查詢集。我需要以某種方式顯示它們,但是我顯示的內容不僅取決於對象的狀態,還取決於其他獨立的事物(通常是登錄的人)。因此,向該模型添加一個函數將無濟於事。
到目前爲止,我一直在做的是將查詢集轉換爲列表或樹結構(取決於任務),併爲每個查詢添加一個「view_extra」屬性。 view_extra是一個字典,我通常堅持取決於誰登錄的東西。除了一個麻煩之外,它也破壞了查詢集的懶惰。我想我可以去做一個生成器,但顯然這並不是Django開發人員想到的。
我應該更多地嘗試queryset註釋,但我不知道如何在一些更復雜的情況下工作。另外,在樹或list-list-list結構場景(包含成員的項目的查詢集是我需要迭代的更多查詢集)中沒有用。
我可以註冊一個過濾器(如這裏建議的django template system, calling a function inside a model),但這是濫用過濾器,對吧?它們旨在改變文本和數據,而不是爲了開發人員故意讓我們不要做的事情的特定目的替代品。
任何「正確」的方式來做到這一點,我不知道?我是否建議這是Django模板系統的缺陷?
+1我同意。我剛剛開始使用Django模板進行一個側面項目(我使用Mako作爲我的主項目),雖然在某些情況下我覺得它很麻煩,但註冊標籤並不是那麼困難。您正在將邏輯移入「代碼」區域,並將其從顯示邏輯中移除。 – 2011-03-23 08:44:14
但是在那一點上,他們爲什麼不讓你傳遞參數給任何成員函數呢?他們只是讓它更加麻煩,以防止我們做得太多? – orblivion 2011-03-23 14:16:09
我不會稱之爲濫用,但我同意@orblivion在這一個。創建一個自定義標籤或過濾器可能是對這個問題的推薦答案,但大多數情況下它只是引入不需要的間接。你的模板仍然有一個方法調用,它仍然傳遞一個參數。唯一的區別是你不得不寫一箇中間人。 – poswald 2011-05-26 16:13:30