在Jinja2中将变量从子模板传递给父模板

时间:2014-07-18 20:35:04

标签: jinja2

我希望有一个父模板和许多子模板以及它们自己传递给父级的变量,如下所示:

parent.html:

{% block variables %}
{% endblock %}

{% if bool_var %}
    {{ option_a }}
{% else %}
    {{ option_b }}
{% endif %}

child.html:

{% extends "parent.html" %}

{% block variables %}
    {% set bool_var = True %}
    {% set option_a = 'Text specific to this child template' %}
    {% set option_b = 'More text specific to this child template' %}
{% endblock %}

但变量最终在父级中未定义。

2 个答案:

答案 0 :(得分:23)

阿。显然,当他们通过街区时,他们不会被定义。解决方案是删除块标记并将其设置为:

parent.html:

{% if bool_var %}
    {{ option_a }}
{% else %}
    {{ option_b }}
{% endif %}

child.html:

{% extends "parent.html" %}

{% set bool_var = True %}
{% set option_a = 'Text specific to this child template' %}
{% set option_b = 'More text specific to this child template' %}

答案 1 :(得分:0)

如果Nathron的解决方案无法解决您的问题,您可以将函数与全局python变量结合使用来传递变量值。

  • 优势:变量的值将在所有模板中提供。您可以在块内设置变量。
  • 缺点:开销更大。

这就是我所做的:

child.j2:

{{ set_my_var('new var value') }}

base.j2

{% set my_var = get_my_var() %}

python代码

my_var = ''


def set_my_var(value):
    global my_var 
    my_var = value
    return '' # a function returning nothing will print a "none"


def get_my_var():
    global my_var 
    return my_var 

# make functions available inside jinja2
config = { 'set_my_var': set_my_var,
           'get_my_var': get_my_var,
           ...
         }

template = env.get_template('base.j2')

generated_code = template.render(config)