从父模板中的include访问子变量

时间:2014-11-03 20:21:03

标签: jinja2

我正在尝试在子模板中指定一个变量,并从另一个包含在父模板中的模板中访问它。

这是我正在尝试做的事情(代码修剪到最低限度):

child.html

{% set var = 'foo' %}
{% extends 'base.html' %}

base.html文件

{% include 'bar.html' %}

一个bar.html

{{ var }}

此时,我渲染child.html文件,没有输出任何内容。

这就是我尝试过的:

如果我在base.html文件而不是child.html文件中指定变量,则可以正常工作。

如果我在渲染调用中传递变量,它会起作用。 template.render(var = 'foo')

将base.html文件归为{% include 'bar.html' with context %}并不能解决问题。

我能够很好地访问base.html文件中的变量,事实上,我已经设法通过将{% set foo = var %}添加到我的base.html并将bar.html更改为{{ foo }}

如此简洁地说,我的问题是:是否有一种方法可以让父模板中包含的模板访问子模板中的变量集? (无需像我的解决方法那样在父文件中定义新变量)

1 个答案:

答案 0 :(得分:0)

我能够通过在父模板上传递子块中的变量来获得此功能。

实施例。我在我的子模板active_page上声明了pricing.html

首先,我无法访问我所包含的文件active_page中的navbar-alt.html,但是当我在导航栏内部设置变量时,它可以正常工作。

{% block wrapper %}
<div id="wrapper">
    {% block navbar %}
        {% set navigation_bar = [
            ('/what-we-do', 'what-we-do', 'what we do'),
            ('/pricing', 'pricing', 'pricing'),
            ('/demo', 'demo', 'demo'),
            ('http://indico.readme.io/v1.0/docs', 'docs', 'docs')
        ] -%}
        {% set active_page = active_page|default('index') -%}

        {% if "dashboard" not in request.path %}
            {% include 'includes/navbar-alt.html' %}
        {% else %}
            {% include 'includes/navbar.html' %}
        {% endif %}
    {% endblock navbar %}

    {% if "dashboard" in request.path %}
        {% block sidebar %}
            {% include 'includes/sidebar.html' %}
        {% endblock sidebar %}
    {% endif %}

    {% block content_wrapper %}
    <div id="content">
        {% block content %}{% endblock content %}
    </div>
    {% endblock content_wrapper %}
    {% include 'includes/flashes.html' %}
</div>
{% endblock wrapper %}

原创灵感: Jinja Tricks