【问题标题】:Django multi-level template extends and nested blocksDjango 多级模板扩展和嵌套块
【发布时间】:2012-02-01 19:16:05
【问题描述】:

假设我有如下所示的三个 html 模板文件。 HTML 是最小的,只是为了说明这一点。

是否可以以某种方式将名为 extra_head_content 的块嵌套在已命名为 extra_head_content 的块中。这个想法是允许第三级模板提供一个名为 extra_head_content 的块。它上面的模板获取该内容,将其添加到名为 extra_head_content 的块中,并将此组合块提供给其父模板。

本质上,我正在寻找跨继承模板文件的块嵌套。

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

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>

account.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 %}

account_profile.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 %}

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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
      

      sekazai docs 明确了使用该系统的注意事项,即:

      1. render_block 只能在块标签之外使用
      2. render_block 不能在包含的模板中使用
      3. 在包含的模板中使用时,应在块标签内使用 addtoblock

      【讨论】:

      • django-sekizai 非常有用......我现在找不到任何关于它与 Django 一起提供的参考吗? AFAICT 它仍然是第 3 方模块
      • 感谢您选择!它似乎包含在 Django CMS 2.2 及更高版本中,但目前不包含在 Django 本身中,所以我已经更正了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 2010-12-13
      • 2017-04-24
      • 2012-01-10
      • 2019-06-26
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多