获取Jinja2模板中所有块的字典

时间:2012-04-05 21:45:39

标签: python jinja2

假设我有一些带有几个块的Jinja2模板:

{% block A %}Blah{% endblock %}
{% block B %}whatever{% endblock %}
{% block C %}you get the idea{% endblock %}

我想要一个Python函数,将其转换为dict(或JSON,或其他),每个块有一个条目。所以输出将是这样的:

{'A': 'Blah', 'B': 'whatever', 'C': 'you get the idea'}

有没有既定的方法呢?

我问,因为我希望通过AJAX获取应用程序更新页面而不是重新加载,同时保留向后兼容性。如果我可以解析Jinja2模板的块,那么我可以使用完全相同的模板文件来轻松生成整个页面或部分页面。所以,作为一个辅助问题......是否有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:5)

您可以查看Template.blocks字段。它具有块渲染功能的字典。

当使用context(我猜)作为参数调用时,块渲染函数返回生成器。

我希望以下代码段可以帮助您。


    for key, blockfun in template.blocks.iteritems():
        print key, ':',  ''.join(blockfun({}))

结果是:


    A : Blah
    C : you get the idea
    B : whatever

答案 1 :(得分:2)

这似乎有效:

from jinja2 import Template
from jinja2.utils import concat

t = """{% block A %}Blah{% endblock %}
{% block B %}whatever {{ a }}{% endblock %}
{% block C %}you get the idea{% endblock %}
"""

template = Template(t)
context = template.new_context({'a': 'AAAAAAAA'})
A = concat(template.blocks['A'](context))
B = concat(template.blocks['B'](context))
C = concat(template.blocks['C'](context))

print A
print B
print C

这给了我三个块中的每一个,在三个独立的变量中呈现。