我们可以附加到{% 块% }而不是覆盖吗?

在我的 core.html 中有一个标签为 javascript 的块。如果我可以在不覆盖其中所有内容的情况下给这个代码块添加更多的代码行,那就太好了。

22408 次浏览
{% block javascript %}
\{\{ block.super }}
... more content ...
{% endblock %}

见: Django 文档-模板继承

使用 block.super在扩展模板时可以很好地工作,但是在包含一个模板时就不那么好了,例如:

{% extends "base.html" %} vs. {% include "partial.html" %}

假设你想在你的页面中间包含一个模板,你也想在页面末尾的一个块中添加一些 javascript: 在包含的模板中调用 block.super将会崩溃。

比照姜戈发行 # 7324# 12008# 13399文件的有关更新。比照 包括标签注意事项:

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

在包含块之前对它们进行计算。这意味着包含来自另一个模板的块的模板将包含已经计算和呈现的块,而不是可以被扩展模板覆盖的块。

在这种情况下,我建议使用 姜戈-塞吉扎伊,它允许您执行以下操作:

{% load sekizai_tags %}


⎧  <p>Some content</p>
<p>Some content</p>             | {% addtoblock "js" %}
|   <script type="text/javascript">
{% include "partial.html" %} -> ⎨     alert("Hello django-sekizai");
|   </script>
<p>Some more content</p>        ⎩ {% endaddtoblock %}




{% render_block "js" %}

来自 Django-sekizai 自述文件:

我开始这个项目的主要原因是 django 和 django-cms 中缺乏一个好的媒体(css/js)框架。是的,在 django 中的表单中使用了 Media 类,但实际上它并不能很好地工作。通常前端的人想要决定是否包含 css 和 javascript 文件,他们不希望编辑 Python 文件来改变,我也不希望他们改变我的 Python 文件。因此,有必要允许您编辑模板的内容之前或之后的点,您现在。还有,我想把副本删掉。因此,我写了 django-sekizai,它确实做到了这一点。它类似于块,只不过不是继承它们,而是扩展它们。