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

在我的core.html我有一个块标记为JavaScript。 如果我可以将更多的行添加到此块而不覆盖其中的所有内容,那将是非常好的。

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

请参阅: Django文档 – 模板inheritance

使用block.super可以在扩展模板时block.super工作,但是在包含模板的时候却不行,比如:

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

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

参看 Django的问题#7324 , #12008 , #13399和文档的相关更新 。 参看 包括标签说明:

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

在包含块之前对它们进行评估。 这意味着包含另一个块的模板将包含已经被评估和渲染的块 – 而不是可以被例如扩展模板覆盖的块。

在这种情况下,我build议使用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自述文件 :

我开始这个项目的主要原因是django和django-cms缺乏一个好的媒体(css / js)框架。 是的,django中的表单中使用了Media类,但实际上并不能很好地工作。 通常前端的人想要决定包含的CSS和JavaScript文件,他们不希望编辑Python文件来改变,我也不希望他们改变我的Python文件。 因此,有必要允许您编辑您现在的位置之前或之后的模板内容。 另外我想重复删除。 结果我写了django-sekizai,这确实是。 它与块相似,只是不是inheritance它们,而是扩展它们。