【问题标题】:Order of operations when parsing Django templates解析 Django 模板时的操作顺序
【发布时间】:2019-10-19 18:32:43
【问题描述】:

我试图弄清楚 Django 在呈现 html 模板时如何处理操作顺序。

以我要回答的问题为例。

我有一个基本模板,其中“{% includes %}”是一段代码,其中包含“{% block %}”语句。

此基本模板在“{% extends %}”中使用,并且“{% block %}”语句在此子模板中被覆盖。

common.html

<div>
{% block content %}{% endblock %}
</div>

base.html

{% include common.html %}

child.html

{% extends 'base.html'%}
{% block content %}
..... some code
{% endblock %}

从我的测试来看,这个块并没有像我预期的那样被覆盖,是我做错了什么还是这取决于 Django 模板解析中的操作顺序。

【问题讨论】:

  • 你应该创建一个minimal reproducible example 来展示你的问题
  • 添加了一个示例,我知道在这种简单的情况下这并不是真正需要的,但是对于生产站点,我试图将 html 分解为可管理的小代码部分,并尝试遵循单一职责校长

标签: django django-templates


【解决方案1】:

这与include 标记的定义一样,与操作顺序无关。来自the docs

include 标签应该被认为是“渲染这个子模板并包含 HTML”的实现,而不是“解析这个子模板并包含它的内容,就好像它是父模板的一部分一样”。这意味着包含的模板之间没有共享状态——每个包含都是一个完全独立的渲染过程。

块在被包含之前被评估。这意味着包含来自另一个块的模板将包含已已被评估和渲染的块 - 而不是可以被例如扩展模板覆盖的块。

【讨论】:

  • 所以这是一个操作顺序,块在包含之前被评估,这给了我我需要的东西,alt
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 2013-08-04
  • 2013-03-31
  • 2012-01-03
  • 2013-01-02
相关资源
最近更新 更多