2013-01-08 142 views

回答

11

他們服務於不同的目的。 include標記僅包含來自現有模板的完整內容和未修改的內容。自定義包含標記將上下文傳遞給一個函數,該函數可以包含邏輯,以便在將上下文傳遞給模板之前對其進行處理。

例如,也許我有一個面板,將顯示在多個頁面上。面板的模板需要通過上下文將一些特定的查詢傳遞給它。包含該面板的頁面不需要其他任何上下文變量。如果我使用include標籤包含面板模板,那麼我必須在包含面板的每個視圖中編寫這些查詢,並將它們作爲上下文變量傳遞。

或者,我可以編寫一個包含查詢的自定義包含標記並將它們傳遞給面板的模板。通過使用自定義包含標籤,我不需要重複代碼以在包含面板的每個視圖中生成其上下文。我的視圖將包含更少的代碼,並且不會被僅由面板使用的上下文變量混亂。

雖然您的意思是,簡單地通過未處理的上下文的自定義包含標記與include標記相同。

+0

優秀點。我想知道他們如何比較性能。 – Wtower

4

需要將模板分離爲較小的文件?使用包括標籤(用於可讀性和可維護性以及DRY)

需要在呈現模板之前包含更多代碼?使用包含標籤(獲取更多的數據,添加一些業務邏輯..它真的像另一個小的無網址視圖,它就像一個模板函數)。

0

原則上,dgel和YardenST的答案提出的觀點是正確的。另外,查看django的代碼可以很好地瞭解這兩個選項在性能上的比較。

使用default template loaders時,兩者絕對沒有區別。兩者最終撥打InclusionTagrender()函數,然後調用模板Loaderget_contents()從文件系統打開模板文件。 render()只有在用於循環模板的情況下才緩存該文件。

請注意,使用django.template.loaders.cached.Loader時可能會出現性能差異。

最後,關於dgel建議在不同視圖之間使用包含標記來實現公共上下文:當html標記位於跨越單個基本模板時,很有可能避免渲染包含模板的小額外開銷在許多意見中,通過使用ContextMixin。這是渲染例如相當常見的情況。基本模板中的主菜單。