ChatGPT解决这个技术问题 Extra ChatGPT

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

在我的 core.html 中,我有一个标记为 javascript 的块。如果我可以在此块中添加更多行而不覆盖其中的所有内容,那就太好了。


k
kzh
{% block javascript %}
    {{ block.super }}
    ... more content ...
{% endblock %}

请参阅:Django documentation - Template inheritance


C
Community

在扩展模板时使用 block.super 效果很好,但在包含模板时效果不佳,即:

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

假设您想在页面中间包含一个模板,并且您还希望它在页面末尾的块中添加一些 javascript:在包含的模板中调用 block.super 会崩溃。

参照。 Django 发出 #7324#12008#13399related update to the documentation。参照。 include tag 注意:

include 标签应该被认为是“渲染这个子模板并包含 HTML”的实现,而不是“解析这个子模板并包含它的内容,就好像它是父模板的一部分一样”。这意味着包含的模板之间没有共享状态——每个包含都是一个完全独立的渲染过程。块在被包含之前被评估。这意味着包含来自另一个块的模板将包含已经评估和渲染的块 - 而不是可以被例如扩展模板覆盖的块。

在这种情况下,我建议使用 django-sekizai,它允许您执行以下操作:

{% 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 README

我开始这个项目的主要原因是 django 和 django-cms 中缺乏好的媒体(css/js)框架。是的,在 django 的表单中使用了 Media 类,但实际上效果并不好。通常前端人员想要决定要包含的 css 和 javascript 文件,他们不想编辑 Python 文件来更改我也不希望他们更改我的 Python 文件。因此,需要允许您编辑位于您现在所在位置之前或之后的模板内容。我还希望删除重复项。结果我写了 django-sekizai,它就是这么做的。它类似于块,只是不是继承它们,而是扩展它们。