在Jinja2中使用包含文件中的块作为父对象 [英] Use blocks from included files for parent in jinja2
本文介绍了在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屋!
查看全文