【问题标题】:Jinja2: How to use named blocks inside included templates, inside extendable templateJinja2:如何在包含的模板和可扩展模板中使用命名块
【发布时间】: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

标签: python inheritance include jinja2 extend


【解决方案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' %}
    

    希望这是有道理的......

    【讨论】:

    • 感谢您的建议。抱歉,我过度简化了代码。现在添加了编辑。我还需要包含许多文件。我不能像那样使用扩展..
    • 好的,我明白你现在的意思了 - 我已经改变了我的答案,以更接近你的要求。简而言之 - 你应该包括 admin.html 而不是 base_admin_content.html
    • 这个答案很奇怪,因为它错过了 OP 模板结构的要点。你为什么要在base_admin.htmlinclude admin.html?是倒置的。所以你有 base_admin.html 作为一般结构,admin.html 作为特定的自定义,base_admin_content 作为 base_admin 页面的一部分。
    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2020-04-07
    • 2019-03-05
    • 2019-04-21
    • 2012-12-16
    相关资源
    最近更新 更多