Django文档中指定了Django模板的解析顺序吗?
根据编写自定义模板标记和API的文档,Django似乎使用深度优先遍历来构建节点树。但是,我在Django文档中找不到任何可以保证这一点的语句。特别是,我想知道在完成任何呈现之前节点树是否已经完全组装。
此外,这对模板继承有什么影响?派生模板中的{% block ... %}标记是在它们位于基模板中的位置解析的,还是在基本模板之前由{% extends "..." %}标记解析的?
发布于 2011-02-26 07:32:44
答案是肯定的,所有节点都是在创建模板对象时创建的。但是,当您调用该对象的呈现方法时,就会发生这种神奇的情况。此模板对象具有一个在上下文中呈现的NodeList。这个呈现就像您前面所说的,深度优先,它只获取附加到父节点的内嵌子字符串(html)。完成节点呈现的下面是NodeList类。因此,根节点是获取附加到其上的所有节点以最终生成文件的节点。如果您还记得,扩展模板标记必须是模板中的第一个,因此它成为根节点,获取其中所有已呈现的节点。
那么遗产呢?外部根节点是如何呈现的?嗯,我还没有弄清楚这里的上下文角色,但是有一个ExtendsNode是由extends标记创建的。这种类型的节点接收父模板名(基本模板)和包含子模板的所有变量、块和节点的上下文(您实际上调用该子模板来呈现)。因此,当呈现该节点时,它执行与每个节点相同的操作,并追加其子节点。这个类的主要区别在于,它从子模板上下文中获取标记为块模板标记的节点,并在父模板中定义带有该名称的块模板标记时将其追加到任何地方。
因此,首先创建节点,扩展模板标记在呈现模板时设法获得它们。
如果您想知道如何创建节点,可以在Django代码中查找令牌和解析器类。
希望这能有所帮助。
https://stackoverflow.com/questions/5123271
复制相似问题