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

时间:2009-11-12 18:45:52

标签: django django-templates

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

2 个答案:

答案 0 :(得分:179)

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

请参阅:Django documentation - Template inheritance

答案 1 :(得分:8)

使用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,就是这样。它与块类似,只是不是继承它们,而是扩展它们。