2012-04-05 75 views
1

比方说,我有一些Jinja2的模板,它的几个模块:获取所有块的字典中的Jinja2模板

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

我想一个Python的功能,将它变成一个字典(或JSON,或其他),每个块有一个条目。所以输出会是这样的:

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

是否有一个既定的方式做到这一点?

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

回答

5

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

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

我希望下面的代码片段可以帮助你。

 

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

,其结果是:

 

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

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 

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