5

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

例如,产品页面有一个评论部分,它使用定义的宏'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)

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

谢谢

4

2 回答 2

4

该解决方案实际上可以在 Armin 的另一个项目中找到 - Flask 实现了一种get_template_attribute方法(有关方法的来源,请参见此处)。这将我们指向 Jinja2 的Template类,更具体地说,是Template类的module属性

我不知道 Pyramid 的 Jinja2 默认渲染器是否为您公开了该功能,但如果默认渲染器不允许您执行此类操作(完全理论上),则应该可以创建和注册自定义渲染器:

@view_config(route_name='review.add_review',
                renderer='helpers/review.jinja2:render_review')
def add_review(request):
    return dict(review=my_new_review)
于 2012-08-14T02:52:17.307 回答
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()

渲染 Jinja2 宏而不影响模板其余部分的内容

于 2015-05-31T05:47:24.933 回答