我有一个名为“旁白”的 Python 字典。这个字典的值是从我的数据库加载的 html 片段,我想将它们注入(inject)到 jinja 模板中。
以下是神社片段:
<div class="small-3 large-3 columns">
{% for k in asides.keys() %}
<div id={{k}} class="aside">{{asides[k]|safe}}</div>
{% endfor %}
</div>
这会创建嵌套的 div。假设我的字典有 id 1 和 2,这将执行以下操作:
<div class="small-3 large-3 columns">
<div id=1 class="aside">some html here
<div id=2 class="aside">some html here
</div>
</div>
</div>
</div>
如果我删除安全过滤器,它会正常创建非嵌套 div。
我想知道为什么安全过滤器会这样做以及如何避免它(因为我不想要嵌套的 div)。
好吧,按照评论中的建议,我意识到问题出在哪里了。我将在此处记录下来,因为在我看来这是一项有趣的业务。
因此,在 app.py 中(使用 Flask):
from flask import Flask, render_template
app = Flask(__name__)
app.debug = True
@app.route('/')
def index():
d = {'1':'<p>Test 1</p', '2':'<p>Test 2</p>'}
return render_template('index.html', d=d)
if __name__=='__main__':
app.run()
请注意 d 中第一个元素的 html 是如何不正确的。结束 p 标签缺少“>”。
然后在模板中
<html>
<body>
<div>
{% for k in d %}
<div class={{k}}>{{d[k]|safe}}</div>
{% endfor %}
</div>
</body>
</html>
这会将第二个 div 嵌套在第一个 div 中。
我认为这个问题仍然悬而未决,因为知道为什么会这样会很有趣。
请您参考如下方法:
您的模板有错误
d = {'1':'<p>Test 1</p', '2':'<p>Test 2</p>'}
第一个para标签没有正确关闭,应该是
'1':'<p>Test 1</p>'
我遇到了同样的问题,输入数据中的 HTML 标签不完整。
我不确定这是否是 Jinja 错误,也许它可以更好地处理它,或者创建一个错误
