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() % insdide base_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.htmlinclude admin.html?是倒置的。所以你有 base_admin.html 作为一般结构,admin.html 作为特定的自定义,base_admin_content 作为 base_admin 页面的一部分。

以上是关于Jinja2:如何在包含的模板和可扩展模板中使用命名块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jinja2 中编辑一些扩展块?

怎样使用jinja2生成yaml文件

flask中jinjia2模板引擎详解1

Jinja2 教程 包含和导入

flask中jinjia2模板引擎使用详解1

Jinja2模板引擎简介