在模板中调用Flask函数

时间:2014-12-23 07:59:02

标签: python flask jinja2

我正在使用Flask和Jinja模板在我的网站上工作,我有一个关于在模板中包含图像的奇怪错误。我有一个继承自post.html的{​​{1}}模板,它从SQL数据库传递一个post对象。问题是当我这样做时,一些Jinja模板函数没有被调用,即图像HTML标签无法根据base.html调用正确加载。常规HTML标记很好,因为我使用url_for()来处理它们。

|safe模板的示例:

post.html

来自{% extends "base.html" %} {% block content %} <div class="post-description"> <p> {{post.body|safe}} </p> </div> {% endblock %} 电话的示例:

post.body

虽然粗体文字显示正常,但<b> I work, and am bolded</b> <img src="{{ url_for('static', filename = 'images/randomImg.png') }}"> 永远不会被调用。在输出的源(在实际网站上),它很容易验证,因为src链接从未正确表示,不像其他评估函数的页面。如果我复制/粘贴url_for行,那么现在我的<img>看起来像是:

post.html

第一个图片调用加载正常,但是内部post.body没有。我不确定是否有Flask或Jinja方法强迫它进行评估,但我希望如此。

编辑解决方案: 诀窍是首先在{% extends "base.html" %} {% block content %} <div class="post-description"> <p> <img src="{{ url_for('static', filename = 'images/randomImg.png') }}"> {{post.body|safe}} </p> </div> {% endblock %} 的调用中呈现post.body,因为这将正确“填写”render_template_string调用,以便url_for可以正确评估。

1 个答案:

答案 0 :(得分:2)

post.body未按您希望的方式处理,因为jinja2默认情况下不会尝试重新呈现自己的输出,这非常有意义。

您可以渲染帖子正文,然后呈现回复:

@app.route("/some/path")
def some_view():
    # ...
    post = Post.query.first()
    rendered_post_body = render_template_string(post.body)
    return render_template("some_template.html", post_body=rendered_post_body)