Mar*_*ann 5 python macros templates jinja2 pyramid
我定义了一些从多个模板调用的宏.
例如,"产品"页面有一个"审阅"部分,该部分使用定义的宏'helpers/review.jinja2'来打印每个审阅.该'helpers/review.jinja2'文件有这两个宏:
{% macro render_review(request,review) -%}
{% macro render_review_comment(request,comment) -%}
Run Code Online (Sandbox Code Playgroud)
当有人通过ajax提交新评论时,我想返回呈现的评论,以便将内容附加到评论部分.
现在,我有一个中间模板'review/review.jinja2',如下所示:
{% import 'helpers/review.jinja2' as review_helper %}
{{ review_helper.render_review(request,review) }}
Run Code Online (Sandbox Code Playgroud)
此模板从视图中呈现:
@view_config(route_name='review.add_review', renderer='review/review.jinja2')
def add_review(request):
return dict(review=my_new_review)
Run Code Online (Sandbox Code Playgroud)
但我希望有更好的方法来做到这一点.那么,是否可以渲染模板中定义的宏?
谢谢
解决方案实际上可以在 Armin 的另一个项目中找到 - Flask 实现了一种get_template_attribute方法(该方法的来源请参见此处)。这将我们指向 Jinja2 的Template类,更具体地说,是Template类的module属性。
我不知道 Jinja2 的 Pyramid 默认渲染器是否为您公开了该功能,但如果默认渲染器不允许您执行类似以下操作(完全理论上),则应该可以创建并注册自定义渲染器:
@view_config(route_name='review.add_review',
renderer='helpers/review.jinja2:render_review')
def add_review(request):
return dict(review=my_new_review)
Run Code Online (Sandbox Code Playgroud)