2

假设我有一些 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 模板块,那么我可以使用完全相同的模板文件轻松生成整个页面或部分页面。所以,作为一个辅助问题......有没有更好的方法来解决这个问题?

4

2 回答 2

6

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

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

我希望以下代码片段对您有所帮助。

    对于 key,在 template.blocks.iteritems() 中的 blockfun:
        打印键, ':', ''.join(blockfun({}))

结果是:

    答:废话
    C:你明白了
    B:随便

于 2012-04-06T03:06:06.813 回答
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

这给了我在三个单独的变量中渲染的三个块中的每一个。

于 2012-04-06T03:10:04.330 回答