【问题标题】:Django template parsing orderDjango模板解析顺序
【发布时间】:2011-07-04 15:24:50
【问题描述】:

Django 模板的解析顺序是否在 Django 文档的某处指定?

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

另外,这对模板继承有何影响?派生模板中的{% block ... %} 标签是在其在基础模板中的位置解析,还是由基础模板之前的{% extends "..." %} 标签解析?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

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

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

    所以节点是首先创建的,当你渲染模板时,扩展模板标签设法获取它们。

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

    希望这会有所帮助。

    【讨论】:

    • 正如我在问题中提到的,我知道这就是当前实施的。但是,我想要一些指向文档的指针,让我得出结论,这不仅仅是一个实现细节。我更喜欢依赖在未来版本中不太可能改变的机制。
    • +1 获得了很好的答案,让我意识到 django 源代码在 github 上!我一直去 djangoproject.com 查找源代码
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2013-08-04
    • 2014-07-20
    • 1970-01-01
    • 2013-03-31
    • 2010-12-26
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多