如何从可调用的视图渲染Jinja2宏?

时间:2012-08-09 21:57:24

标签: python templates macros pyramid jinja2

我定义了一些从多个模板调用的宏。

例如,“产品”页面有一个“审核”部分,该部分使用'helpers/review.jinja2'中定义的宏来打印每个审核。 'helpers/review.jinja2'文件有两个宏:

{% macro render_review(request,review) -%}
{% macro render_review_comment(request,comment) -%}

当有人通过ajax提交新评论时,我想返回呈现的评论,以便将内容附加到评论部分。

现在,我有一个中间模板'review/review.jinja2',如下所示:

{% import 'helpers/review.jinja2' as review_helper %}
{{ review_helper.render_review(request,review) }}

此模板从视图中呈现:

@view_config(route_name='review.add_review', renderer='review/review.jinja2')
def add_review(request):
    return dict(review=my_new_review)

但我希望有更好的方法来做到这一点。那么,是否可以渲染模板中定义的宏?

由于

2 个答案:

答案 0 :(得分:3)

解决方案实际上可以在Armin的另一个项目中找到 - Flask实现了get_template_attribute方法(请参阅here了解方法的来源)。这指向了Jinja2的Template课程,更具体地说是Template课程module attribute

我不知道金字塔的Jinja2默认渲染器是否为你公开了这个功能,但是如果默认渲染器没有让你做这样的事情(完全理论化的话),应该可以创建并注册一个自定义渲染器: / p>

@view_config(route_name='review.add_review',
                renderer='helpers/review.jinja2:render_review')
def add_review(request):
    return dict(review=my_new_review)

答案 1 :(得分:0)

这种方法在其他地方提出过,它帮助了我:

@app.route("/test")
def test_view():
    t = app.jinja_env.get_template('macros.html')
    mod = t.make_module({'request': request})
    return mod.my_macro()

Render Jinja2 macro without bothering what's in the rest of the template