Django 多级模板扩展和嵌套块

Posted

技术标签:

【中文标题】Django 多级模板扩展和嵌套块【英文标题】:Django multi-level template extends and nested blocks 【发布时间】: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 %

【问题讨论】:

【参考方案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 明确了使用该系统的注意事项,即:

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

【讨论】:

django-sekizai 非常有用......我现在找不到任何关于它与 Django 一起提供的参考吗? AFAICT 它仍然是第 3 方模块 感谢您选择!它似乎包含在 Django CMS 2.2 及更高版本中,但目前不包含在 Django 本身中,所以我已经更正了我的答案。

以上是关于Django 多级模板扩展和嵌套块的主要内容,如果未能解决你的问题,请参考以下文章

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?

Django:覆盖和扩展应用程序模板

在 if 条件内调用块:django 模板

如何在 Django 模板中的“带有模板标签”中设置 Django 渲染块值?

django:在包含的模板中使用块

Django模板:在同一基础中使用多个块标签