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

PKK*_*Kid 109 django django-templates

在我的core.html中,我有一个标记为javascript的块.如果我可以在这个块中添加更多行而不覆盖其中的所有内容,那将会很棒.

Ste*_*osh 188

{% block javascript %}
    {{ block.super }}
    ... more content ...
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

请参阅:Django文档 - 模板继承


Max*_* R. 9

block.super扩展模板时使用工作正常但包含模板时效果不佳,即:

{% extends "base.html" %} vs. {% include "partial.html" %}
Run Code Online (Sandbox Code Playgroud)

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

参看 Django发布#7324,#12008,#13399以及文档相关更新.参看 包括标签说明:

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" %}
Run Code Online (Sandbox Code Playgroud)

来自django-sekizai自述文件:

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