Используйте блоки из включенных файлов для родителя в jinja2 - PullRequest
7 голосов
/ 09 марта 2012

Я не уверен, возможно ли то, что я хочу сделать: я пытаюсь получить блок в родительском шаблоне для заполнения файлом, включенным в дочерний шаблон родителя.

Лучший способ объяснить это - контрольный пример:

Файл t1.djhtml :

<root>
    <block t3_container>
        {% block t3 %}This should be 'CONTENT'{% endblock %}
    </block t3_container>

    <block t2_container>
    {% block t2 %}{% endblock %}
    </block t2_container>
</root>

Файл t2.djhtml :

{% extends 't1.djhtml' %}

{% block t2 %}
        <block t2>
            {%- include 't3.djhtml' with context %}
        </block t2>
{% endblock %}

Файл t3.djhtml :

{% block t3 %}
        <block t3>
            CONTENT
        </block t3>
{% endblock %}

Файл test.py :

from jinja2 import Environment, FileSystemLoader
env  = Environment(loader=FileSystemLoader(''))
t=env.get_template('t2.djhtml')
print t.render()

Вывод:

<root>
    <block t3_container>
        This should be 'CONTENT'
    </block t3_container>

    <block t2_container>

        <block t2>
        <block t3>
            CONTENT
        </block t3>

        </block t2>

    </block t2_container>
</root>

Блок t2 должен быть пустым, а t3_container должен иметь содержимое блока t3 внутри. Как мне это сделать?

1 Ответ

4 голосов
/ 13 марта 2012

Чтобы ответить на мой собственный вопрос, вы можете использовать макросы во включенном файле, но вместо того, чтобы включить их, вы импортируете макросы с контекстом.

//File T1
<root>
  <block t3_container>
    {% block t3 %}{% endblock %}
  </block t3_container>

  <block t2_container>
  {% block t2 %}{% endblock %}
  </block t2_container>
</root>

// File T2
{% extends 't1.djhtml' %}
{%- from 't3.djhtml' import inner, inner2 with context %}

{% block t3 %}
   {{inner2()}}   
{% endblock %}

{% block t2 %}
    <block t2>
        {{ inner() }}
    </block t2>
{% endblock %}

// File T3
{% macro inner2() %}
    <block t3>
        CONTENT '{{foo+1}}'
    </block t3>
{% endmacro %}

{% macro inner() %}
  hello
{% endmacro %}

// test.py
from jinja2 import Environment, FileSystemLoader
env  = Environment(loader=FileSystemLoader(''))
t=env.get_template('t2.djhtml')
print t.render({ 'foo' : 122 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...