Skip to main content
 首页 » 编程设计

python之在 jinja2 中为父级使用包含文件中的 block

2025年05月04日13jyk

我不确定我想做的事情是否可行:我正在尝试让父模板中的一个 block 由包含在父模板中的文件填充。

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

文件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 block 应该是空的,t3_container 应该包含 block t3 的内容。我该如何实现?

请您参考如下方法:

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


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

测试.py

from jinja2 import Environment, FileSystemLoader 
 
env = Environment(loader=FileSystemLoader(".")) 
t = env.get_template("T2.html") 
 
print(t.render({"foo": 122}))