Answers:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
请参阅:Django文档-模板继承
block.super
扩展模板时,使用工作正常,但包含模板时效果不佳,即:
{% extends "base.html" %} vs. {% include "partial.html" %}
假设您要在页面中间添加一个模板,并且还希望它在页面末尾的块中添加一些javascript:调用block.super
包含的模板会崩溃。
cf. Django发行了#7324,#12008,#13399和相关文档更新。cf. 包括标签说明:
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和django-cms中缺少好的媒体(css / js)框架。是的,在django中的表单中使用了Media类,但实际上效果不是很好。通常,前端人员想确定要包含的CSS和javascript文件,他们不想编辑Python文件来更改我也不希望他们更改我的Python文件。因此,有必要允许您编辑当前位置之前或之后的模板内容。我也想删除重复项。结果,我写了django-sekizai,它确实做到了。它类似于块,只是扩展了它们而不是继承它们。