Передать переменные из дочернего шаблона в родительский в 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 %}
Но переменные заканчиваются undefined в родительском.
Ответы
Ответ 1
Ах. По-видимому, они не будут определены, когда они пройдут через блоки. Решение состоит в том, чтобы просто удалить теги блоков и настроить его так:
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' %}
Ответ 2
Если решение 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)