我正在使用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
可以正确评估。
答案 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)