在jinja2中使用包含文件中的块作为父项

Ric*_*ard 7 python jinja2

我不确定我想做什么是可能的:我正在尝试在父模板中获取一个块,以便由父模板的子模板中包含的文件填充.

解释这个的最好方法是测试用例:

文件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>
Run Code Online (Sandbox Code Playgroud)

文件t2.djhtml:

{% extends 't1.djhtml' %}

{% block t2 %}
        <block t2>
            {%- include 't3.djhtml' with context %}
        </block t2>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

文件t3.djhtml:

{% block t3 %}
        <block t3>
            CONTENT
        </block t3>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

文件test.py:

from jinja2 import Environment, FileSystemLoader
env  = Environment(loader=FileSystemLoader(''))
t=env.get_template('t2.djhtml')
print t.render()
Run Code Online (Sandbox Code Playgroud)

输出是:

<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>
Run Code Online (Sandbox Code Playgroud)

t2块应为空,并且内部t3_container应该有块t3的内容.我该如何做到这一点?

Ric*_*ard 5

您可以在包含的文件中使用宏,但不是包含它,而是导入带有上下文的宏。


t1.html

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

  <block t2_container>
  {% block t2 %}{% endblock %}
  </block t2_container>
</root>
Run Code Online (Sandbox Code Playgroud)

t2.html

{% extends 'T1.html' %}
{%- from 'T3.html' import inner, inner2 with context %}

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

{% block t2 %}
    <block t2>
        {{ inner() }}
    </block t2>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

t3.html

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

{% macro inner() %}
  hello
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

测试文件

from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader("."))
t = env.get_template("T2.html")

print(t.render({"foo": 122}))
Run Code Online (Sandbox Code Playgroud)