簡體   English   中英

Django模板解析順序

[英]Django template parsing order

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

根據編寫自定義模板標簽和API的文檔,似乎Django使用深度優先遍歷來構建節點樹。 但是,我在Django文檔中找不到任何保證這一點的聲明。 特別是,我想知道在完成 任何渲染之前節點樹是否已完全組裝。

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

答案是肯定的,所有節點都是在創建Template對象時創建的。 但是當你調用這個對象的render方法時會發生魔法。 這個Template對象有一個NodeList,它在一個上下文中呈現。 這個渲染就像你之前說的那樣完成,深度優先,它只是獲取附加到父節點的內部子字符串(html)。 這是節點渲染完成的NodeList類 因此,根節點是獲取附加到其上的所有節點以最終生成文件的節點。 如果你還記得,擴展模板標簽必須首先在模板中,這樣它才能成為獲得所有已經渲染的節點的根節點。

現在,繼承怎么樣? exteds根節點是如何呈現的? 好吧,我還沒有弄清楚這里的上下文角色,但有一個ExtendsNode是由extends template標簽創建的。 這種類型的節點接收父模板名稱(您的基本模板)以及包含子模板的所有變量,塊和節點的上下文(您實際調用的那個模板)。 因此,當渲染此節點時,它會執行與每個節點相同的操作,附加其子節點。 這個類的主要區別在於它從子模板上下文中獲取用塊模板標記標記的節點,並將它附加到您在父模板中使用該名稱定義塊模板標記的任何位置。

因此,首先創建節點,並在創建模板時管理擴展模板標記以獲取它們。

如果您想知道如何創建節點,可以在Django代碼中查找Token和Parser類

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM