2010-12-11 176 views
1

我在我的Django項目中有一個python文件,其中包含一個自定義模板標記和一個自定義模板過濾器。我的自定義Django模板過濾器「無效過濾器」錯誤,但沒有任何其他過濾器

我的自定義標籤使用template.loader.get_template()加載另一個模板文件。這工作得很好......直到我將我的自定義過濾器添加到加載的模板。

現在我得到一個Django「Invalid Filter」TemplateSyntaxError異常。看着調用堆棧,Django無法加載我的模板過濾器。

這裏的東西變得奇怪。我可以使用其他模板的自定義過濾器。我可以使用由我的自定義標記加載的模板中的任何其他過濾器。但是我不能在我自己的自定義標籤中使用我自己的過濾器。

造成這種情況的明顯原因是我的自定義標記/過濾器文件沒有加載到我的模板HTML中,但我正確加載它。 (因爲當我不加載它,我會得到一個不同的錯誤 - 「無效塊標記」)

我在Python 2.7上運行Django 1.2.3。

[順便說一句,我終於自己找到了答案,但花了我幾個小時,我無法在stackoverflow或google上找到答案,所以我要回答我自己的問題,不必浪費像我一樣多的時間]

回答

7

答案是非常簡單:將自定義標記和自定義過濾器分成兩個單獨的python文件,它將工作。

我懷疑問題是這樣的:自定義標記使用template.loader.get_template()加載另一個模板。該模板文件包含一個{% load %}標籤,該標籤嘗試加載定義了父定製標籤的相同文件。出於某種原因,這不起作用 - 也許是因爲它會導致無限循環,或者因爲Django認爲它已經加載。

我沒有嘗試recusrively加載過濾器內的自定義標籤,或另一個標籤內的標籤,看看是否也有相同的問題,但如果它發生,修復將是相同的:如果你想要使用template.loader.get_template()加載包含對自己的自定義標籤或過濾器的調用的模板,請確保調用template.loader.get_template()的文件與定義包含的標籤/文件的文件不同。