Jinja2:如何在可扩展模板中的包含模板内使用命名块

22

我遇到了Jinja2 Extend和Import的问题。

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>

管理.html

{% extends 'base_admin.html' %}
{% block body_content %}
    <div>BodyContent</div>
{% endblock %}

body_content中的代码未传递到base_admin_content.html中。有什么解决方法吗?

注意

这不是重复的问题 jinja2: blocks in included files.. 这里在不同的文件中进行包含

base_admin_content.html中定义{% macro admin_content() %},并在base_admin.html中导入它。

{% from "base_admin_content.html" import admin_content with context %}
        {{ admin_content() }}.

也没有影响。


你正在使用哪个版本的Jinja2? - pbacterio
Jinja 2.7.1 是已安装的版本。 - Jasim Muhammed
2个回答

8

编辑 - 反映原始问题的更改

好的,既然我知道你一定需要包含,这是我会做的方式:不要包含base_admin_content.html文件,而应该直接将admin.html文件包含在base_admin.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' %}

希望你能理解...

感谢您的建议。抱歉我对代码进行了过分简化..现在已经添加了编辑。还有许多文件需要包括。我无法像那样使用extend函数。 - Jasim Muhammed
请查看以下链接中的工单:https://dev59.com/enI-5IYBdhLWcg3wMFS0 - Jasim Muhammed
好的,我现在明白你的意思了 - 我已经修改了我的答案,使其更接近你所要求的。简而言之 - 你应该包含 admin.html 而不是 base_admin_content.html - Quentin Donnellan
这个答案很奇怪,因为它忽略了 OP 的模板结构的重点。为什么你要在 base_admin.html 中包含 admin.html?这是颠倒了。所以你应该把 base_admin.html 作为一般的结构,admin.html 作为具体的定制,base_admin_content 作为 base_admin 页面的部分。 - est

0

你可以分别从 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的块,这是灵活而简单的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接