Django多级模板扩展和嵌套块

30

假设我有以下三个 HTML 模板文件。HTML 内容很简单,只是为了阐述观点。

是否可能在名为 extra_head_content 的块内嵌套名为 extra_head_content 的块。想法是允许第三级模板提供名为 extra_head_content 的块。它上面的模板接受该内容,将其添加到其名为 extra_head_content 的块中,并将此组合块提供给其父模板。

基本上,我正在寻找跨继承模板文件进行块嵌套的方法。

我要解决的确切情况是,任何模板都应该能够向 head 元素添加额外的 JavaScript 或 CSS 文件。但是,最低级别的模板不应关心它嵌套了多少级。同样,中间模板提供的额外头部内容不应被终端模板的块元素覆盖。

base.html

<html>
<head>
    <link rel="stylesheet" type="text/css" href="/static/css/reset.css" />
    {% block extra_head_content %}{% endblock %}
</head>
<body>{% block content %}{% endblock %}
</html>

账户.html

{% extends "base.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
    {% block extra_head_content  %}{% endblock %}
{% endblock %}

{% block content %}
    <div id="menu">...</div>
    {% block account_content %}{% endblock %}
{% endblock %}

账户个人资料.html

{% extends "account.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" />
{% endblock %}

{% block account_content %}
    Welcome to your profile
{% endblock %}
2个回答

55

不行,但你可以使用{{ block.super }}

{% block extra_head_content  %}
    {{ block.super }}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% endblock %}

3

Django-sekizai 模块轻松处理 CSS 和 JavaScript 的添加:

#base.html
{% load sekizai_tags %}
# define your template, declaring blocks for inheriting templates:
{% block content %}
{% endblock content %}
# at the bottom of the body:
{% render_block "js" %}
</body>
</html>

#my_template.html
{% extends "base.html" %}
{% load sekizai_tags %}
{% block content %}
# content goes here...
# so does the addtoblock tag
    {% addtoblock "js" %}
        <script src="my/awesome/script.js"></script>
    {% endaddtoblock %}
{% endblock content %}
# Note no addtoblock tags outside the block-endblock tags

sekizai文档明确指出使用该系统的注意事项,即:

  1. render_block只能在block标签之外使用
  2. render_block不能在被包含的模板中使用
  3. 当在包含的模板中使用addtoblock时应该在block标签内部使用

1
django-sekizai非常有用...但我现在找不到它是否随Django一起发布的任何参考资料?据我所知,它仍然是第三方模块。 - Anentropic
谢谢您的指正!看起来这已经包含在Django CMS 2.2及更高版本中,但是目前还没有包含在Django本身中,因此我已经纠正了我的回答。 - James Fletcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接