Jinja2:如何在包含的模板和可扩展模板中使用命名块
Posted
技术标签:
【中文标题】Jinja2:如何在包含的模板和可扩展模板中使用命名块【英文标题】:Jinja2: How to use named blocks inside included templates, inside extendable template 【发布时间】:2014-03-10 21:25:14 【问题描述】:我遇到了 Jinja2 扩展和导入的问题。
base_admin.html
<html>
<body>
<div class="outerbody">
<somehtml code>
% include "base_admin_nav.html" %
% include "base_admin_sidebar.html" %
% include "base_admin_content.html" %
</div>
</body>
</html>
base_admin_content.html
<div class="innerbody">
% block body_content %
% endblock %
</div>
admin.html
% extends 'base_admin.html' %
% block body_content %
<div>BodyContent</div>
% endblock %
body_content 中的代码不会传递给 base_admin_content.html。任何解决方法?
注意
这不是这个的重复 jinja2: blocks in included files.. 包含在此处的不同文件中完成
定义
% macro admin_content() %
insdidebase_admin_content.html
并将其导入到base_admin.html
中使用
% from "base_admin_content.html" import admin_content with context %
admin_content() .
也没有效果。
【问题讨论】:
你用的是什么 Jinja2 版本? 安装的是 Jinja 2.7.1 【参考方案1】:您可以分别从 base_admin 和 base_admin_content 继承:
base_admin.html:
<html>
<body>
<div class="outerbody">
...
% block admin_content %
% include "default_admin_content.html" %
% endblock %
</div>
</body>
</html>
base_admin_content.html:(不变)
<div class="innerbody">
% block body_content %% endblock %
</div>
admin.html:
% extends 'base_admin.html' %
...
% block admin_content %
% include "admin_content.html" %
% endblock %
admin_content.html:
% extends 'base_admin_content.html' %
% block body_content %
<div>BodyContent</div>
% endblock %
这样base_admin 不需要知道base_admin_content 的blocks, 它既灵活又简单。
【讨论】:
【参考方案2】:已编辑 - 以反映原始问题的变化
好的,既然我知道您肯定需要包含,我会这样做:您应该将admin.html
文件直接包含到base_admin.html
中,而不是包含base_admin_content.html
文件。 admin.html
文件将扩展 base_admin_content.html
并且一切正常:
base_admin.html
<html>
<body>
<div class="outerbody">
<somehtml code>
% include 'admin.html' %
</div>
</body>
</html>
admin.html
% extends 'base_admin_content.html' %
% block body_content %
<div>BodyContent</div>
% endblock %
base_admin_content.html
% block innerbody %
<div class="innerbody">
% block body_content %
% endblock %
</div>
% endblock %
为什么这行得通,而您的原始代码却不行?
在您的base_admin.html
文件中
% include 'base_admin_content.html' %
我们没有对 admin.html 的引用,这就是为什么 admin.html 文件中什么都没有显示的原因!。因此,我们应该这样做:
% include 'admin.html' %
因为在扩展行中确实包含对 base_admin_content 的引用:
% extends 'base_admin_content.html' %
希望这是有道理的......
【讨论】:
感谢您的建议。抱歉,我过度简化了代码。现在添加了编辑。我还需要包含许多文件。我不能像那样使用扩展.. 请看票也***.com/questions/1976651/… 好的,我明白你现在的意思了 - 我已经改变了我的答案,以更接近你的要求。简而言之 - 你应该包括admin.html
而不是 base_admin_content.html
这个答案很奇怪,因为它错过了 OP 模板结构的要点。你为什么要在base_admin.html
中include admin.html
?是倒置的。所以你有 base_admin.html 作为一般结构,admin.html 作为特定的自定义,base_admin_content
作为 base_admin 页面的一部分。以上是关于Jinja2:如何在包含的模板和可扩展模板中使用命名块的主要内容,如果未能解决你的问题,请参考以下文章