我有一个名为“asides”的python字典。这个dict的值是从我的数据库加载的html片段,我想将它们注入jinja模板。
以下是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。假设我的dict有id和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是如何不正确的。结束标签缺少“&gt;”。
然后在模板中
<html>
<body>
<div>
{% for k in d %}
<div class={{k}}>{{d[k]|safe}}</div>
{% endfor %}
</div>
</body>
</html>
这会将第二个div嵌套在第一个div中。
我认为问题仍然存在,因为知道为什么会发生这种情况会很有趣。
答案 0 :(得分:0)
您的模板有错误
d = {'1':'<p>Test 1</p', '2':'<p>Test 2</p>'}
第一个para标签没有正确关闭,应该是
'1':'<p>Test 1</p>'
我遇到了同样的问题,输入数据中的HTML标记不完整。
我不确定这是否是Jinja错误,也许它可以更好地处理它,或者创建错误