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


116

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

Answers:



9

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-sekizai自述文件

我开始这个项目的主要原因是django和django-cms中缺少好的媒体(css / js)框架。是的,在django中的表单中使用了Media类,但实际上效果不是很好。通常,前端人员想确定要包含的CSS和javascript文件,他们不想编辑Python文件来更改我也不希望他们更改我的Python文件。因此,有必要允许您编辑当前位置之前或之后的模板内容。我也想删除重复项。结果,我写了django-sekizai,它确实做到了。它类似于块,只是扩展了它们而不是继承它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.