在Jinja2中使用包含文件中的块作为父对象 [英] Use blocks from included files for parent in jinja2

查看:35
本文介绍了在Jinja2中使用包含文件中的块作为父对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm not sure if what I want to do is possible: I'm trying to get a block in a parent template to be filled out by a file included in a child template of the parent.

解释此问题的最好方法是一个测试用例:

The best way to explain this is a test case:

文件 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的内容.我该怎么做?

The t2 block should be empty, and t3_container should have block t3's content inside. How do I accomplish this?

推荐答案

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

You can use macros in the included file, but instead of including it, you import the macros with context.

T1.html

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

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

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 %}

T3.html

{% 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.html")

print(t.render({"foo": 122}))

这篇关于在Jinja2中使用包含文件中的块作为父对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆