Django模板解析顺序

时间:2011-02-25 22:11:27

标签: django django-templates

Django模板的解析顺序是在Django文档中指定的吗?

基于writing custom template tags和API的文档,似乎Django使用深度优先遍历来构建节点树。但是,我在Django文档中找不到任何保证这一点的声明。特别是,在任何渲染完成之前,我想知道节点树是否完全组装。

另外,这如何影响模板继承?派生模板中的{% block ... %}标记是在基本模板中的位置进行了解析,还是在基本模板之前由{% extends "..." %}标记进行了解析?

1 个答案:

答案 0 :(得分:2)

答案是肯定的,在创建Template对象时会创建所有节点。但是当你调用这个对象的render方法时会发生魔法。这个Template对象有一个NodeList,它在一个上下文中呈现。这个渲染就像你之前说的那样完成,深度优先,它只是获取附加到父节点的内部子字符串(html)。 Here is the NodeList class节点渲染完成的地方。因此,根节点是获取附加到其上的所有节点以最终生成文件的节点。如果你还记得,扩展模板标签必须在模板中排在第一位,这样它才能成为获取所有已经渲染的节点的根节点。

现在,继承怎么样? exteds根节点是如何呈现的?好吧,我还没有弄清楚这里的上下文角色,但是有一个ExtendsNode由extends template标签创建。这种类型的节点接收父模板名称(您的基本模板)以及包含子模板的所有变量,块和节点的上下文(您实际调用的那个模板)。因此,当渲染此节点时,它会执行与每个节点相同的操作,附加其子节点。这个类的主要区别在于它从子模板上下文中获取用块模板标记标记的节点,并将它附加到您在父模板中使用该名称定义块模板标记的任何位置。

因此首先创建节点,并且扩展模板标签设法在渲染模板时获取它们。

如果您想知道如何创建节点,可以在Django代码中查找the Token and Parser class

希望这有帮助。