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


0 Answers

使用block.super在扩展模板时工作正常,但在包含模板时效果不佳,即:

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

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

参看 Django的问题#7324#12008#13399文档相关更新 。 参看 包括标签注释:

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,这确实如此。 它与块相似,只是扩展它们而不是继承它们。

Question

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




Related