【问题标题】:Can we append to a {% block %} rather than overwrite?我们可以追加到 {% block %} 而不是覆盖吗?
【发布时间】:2010-12-16 00:26:24
【问题描述】:

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

【问题讨论】:

    标签: django django-templates


    【解决方案1】:
    {% block javascript %}
        {{ block.super }}
        ... more content ...
    {% endblock %}
    

    见:Django documentation - Template inheritance

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 2016-06-19
        • 2012-07-13
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 2017-11-11
        相关资源
        最近更新 更多