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 块片段?