gpt4 book ai didi

Django模板解析顺序

转载 作者:行者123 更新时间:2023-12-02 02:27:43 25 4
gpt4 key购买 nike

Django 文档中是否指定了 Django 模板的解析顺序?

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

此外,这对模板继承有何影响?是{% block ... %}派生模板中的标记在它们在基本模板中的位置被解析,或者它们是由 {% extends "..." %} 解析的在基本模板之前标记?

最佳答案

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

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

因此首先创建节点,然后 extends 模板标签设法在渲染模板时获取它们。

如果你想知道节点是如何创建的,你可以寻找the Token and Parser class在 Django 代码中。

希望这对您有所帮助。

关于Django模板解析顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com