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

时间:2014-02-12 13:51:23

标签: python inheritance include jinja2 extend

我遇到了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() }}.
  

也没有效果。

1 个答案:

答案 0 :(得分:4)

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

好的,既然我知道你肯定需要包含,我就是这样做的:不应该包含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' %}

希望这有意义......