Передать переменные из дочернего шаблона в родительский в 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)