【发布时间】:2010-12-16 00:26:24
【问题描述】:
在我的 core.html 中,我有一个标记为 javascript 的块。如果我可以在此块中添加更多行而不覆盖其中的所有内容,那就太好了。
【问题讨论】:
在我的 core.html 中,我有一个标记为 javascript 的块。如果我可以在此块中添加更多行而不覆盖其中的所有内容,那就太好了。
【问题讨论】:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
【讨论】:
使用block.super 在扩展模板时效果很好,但在包含模板时效果不佳,即:
{% extends "base.html" %} vs. {% include "partial.html" %}
假设您想在页面中间包含一个模板,并且您还希望它在页面末尾的块中添加一些 javascript:在包含的模板中调用 block.super 会崩溃。
参照。 Django 发出#7324、#12008、#13399 和related 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 和 django-cms 中缺乏一个好的媒体 (css/js) 框架。是的,在 django 的表单中使用了 Media 类,但实际上效果并不好。通常前端人员想要决定要包含的 css 和 javascript 文件,他们不想编辑 Python 文件来更改我也不希望他们更改我的 Python 文件。因此,需要允许您编辑在您现在所在位置之前或之后的模板内容。我还希望删除重复项。结果我写了 django-sekizai,它就是这么做的。它类似于块,只是不是继承它们,而是扩展它们。
【讨论】: