2012-06-08 41 views
5

我遇到了Django模板系統非常奇怪的行爲。我有一個模板文件,即test.html,其中包括遞歸本身:有條件的在Django中包含標籤

{% include "test.html" %} 

當然,這樣的模板有沒有機會被渲染,因爲沒有終止條件。好吧,讓我們嘗試以下操作:

{% if test_false %}{% include "test.html" %}{% endif %}, 

其中test_false是傳遞給模板,等於False一個變量。

人們期望它只是將不包括任何東西,但它的作用:

RuntimeError at /test/ 
maximum recursion depth exceeded while calling a Python object 

我不明白這一點。包含標籤可以從當前上下文獲取參數,所以我懷疑它在頁面的任何其他部分之前執行。那爲什麼它忽略條件標籤?

回答

6

Django進行了優化,包括在編譯時由常量給出的模板。

模板變量的設置名稱,包括它以這種方式:

{% include test_template %} 

Django將不能夠使用它的優化,你的代碼應該工作。

-1

像Thomasz說,Django的,只能使這種優化,如果路徑被定義爲包括模板常量字符串 - 像這樣:

{% include "test.html" %} 

但我寧可不要把模板路徑來自Python代碼的上下文。

因此,這裏是達到相同的結果的稍微自給自足的方式 - 包裹包括在with

{% with "test.html" as path %} 
    {% include path %} 
{% endwith %}