2011-02-25 70 views
3

是否在Django文檔的某處指定了Django模板的解析順序?Django模板解析順序

基於對writing custom template tags和API的文檔,它似乎Django使用深度優先遍歷建立節點樹。但是,我無法在Django文檔中找到保證這一點的任何聲明。特別是,我想知道節點樹是否完全彙編之前任何渲染完成。

此外,這是如何影響模板的繼承?派生模板中的{% block ... %}標記是在基本模板中的位置解析的,還是由基礎模板之前的{% extends "..." %}標記解析?

回答

2

答案是肯定的,所有節點都是在創建模板對象時創建的。但是當你調用這個對象的渲染方法時會發生魔法。這個Template對象有一個NodeList,它在上下文中呈現。這個渲染是按照你之前說的完成的,首先是深度,它只是獲取父節點附加的inners子字符串(html)。 Here is the NodeList class節點渲染完成。因此,根節點是將所有節點附加到它以最終生成文件的節點。如果您還記得,模板中的擴展模板標籤必須先放在模板中,以便它成爲獲取其中所有已渲染節點的根節點。

現在,繼承呢?如何渲染exteds根節點?那麼,我還沒有弄清楚這裏的上下文角色,但是有一個由擴展模板標籤創建的ExtendsNode。這種類型的節點接收父模板名稱(基本模板)以及包含子模板(實際調用來渲染的模板)的所有變量,塊和節點的上下文。所以當這個節點被渲染時,它會完成每個節點所做的事情,並追加他的子節點。這個類的主要區別在於,它從子模板上下文中獲取標記有塊模板標記的節點,並將其附加到您在父模板中定義了具有該名稱的塊模板標記的任何位置。

因此,節點首先被創建,並且擴展模板標籤設法在您渲染模板時獲取它們。

如果你想知道如何節點創建的,你可以在Django的代碼尋找the Token and Parser class

希望這會有所幫助。

+0

很抱歉,如果它是很難讀,但我並不擅長英語... – FernandoEscher 2011-02-26 07:39:17

+0

正如我在我的問題提到的,我知道這是什麼目前實施。但是,我想要一些指向文檔的指針,這些指針允許我總結這不僅僅是實現細節。我更願意依靠那些在未來版本中不太可能改變的機制。 – 2011-02-27 17:17:20

+0

+1爲好的答案,讓我意識到,Django的源代碼在github上!我一直在去djangoproject.com查找源代碼 – 2011-11-21 23:44:02