2011-02-25 127 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