EDIT找到解决方案后,我更改了标题以更好地反映问题。Unstackify的回复仍然有效,并与问题的文本相关
我有一个字典列表,我想和Jinja2:一起循环浏览
dict = [{'symbol': 'BTCUSDT', 'price': 59325.1234, 'Qty': 2501}, {'symbol': 'ETHUSDT', 'price': 55.12, 'Qty': 14}]
我使用了下面的循环(从这里开始)。我希望外部的"for"语句拾取列表中的第一个项目(它将是dict),内部的"for"循环遍历dict中的k,v。
{% for dict_item in dict %}
{% for key, value in dict_item.items() %}
<h1>Key: {{key}}</h1>
<h2>Value: {{value}}</h2>
{% endfor %}
{% endfor %}
然而,Jinja给了我以下错误——这表明Jinja没有将列表中的元素识别为dicts:
jinja2.exceptions.UndefinedError: 'list object' has no attribute 'items'
即使过于简化,我也会不断地得到同样的错误:
{% for symbol in dict %}
<h2>{{ symbol }}</h2>
{% endfor %}
金贾的文档对此不够详细。我也尝试过这种方法,但没有成功。只传递一个dict(而不是dict列表)效果很好。
有人能解释我为什么会出现这个错误并建议更好的代码吗?用不同的方法得到相同的错误信息会让我认为我的想法中存在一些根本错误,但我无法弄清楚。
您的代码在后端是什么样子的?
我在python中有这个:
@app.route('/test1')
def test1():
dict = [{'symbol': 'BTCUSDT', 'price': 59325.1234, 'Qty': 2501}, {'symbol': 'ETHUSDT', 'price': 55.12, 'Qty': 14}]
return render_template('test1.html', dict=dict)
这在我的.html文件中:
<!doctype html>
<title>Jinja Test</title>
{% for dict_item in dict %}
{% for key, value in dict_item.items() %}
<h1>Key: {{ key }}</h1>
<h2>Value: {{ value }}</h2>
{% endfor %}
{% endfor %}
我的渲染输出看起来是我期望的格式:
密钥:符号
值:BTCUSDT
密钥:价格
价值:59325.1234
等
问题不在于代码,而在于环境——我更改了问题的标题以更好地反映问题。
事实证明,Flask安装很可能存在问题,因为重新安装(很大程度上)解决了这个问题——上面的代码(问题和答案中的代码)都能正常工作。
此外,在调试过程中,我注意到我的环境中的Jinja2不喜欢HTML()中的注释文本,并且当出现这种情况时,它的行为是不确定的。Equal代码有时会抛出错误,有时不会,Jinja2错误消息会指向注释掉的代码。
Python 3.9.6,Flask 2.0.1,Jinja2 3.0.1,Chrome 93.0.4577.63,PyCharm 2021.1在Win10 Home 20H2 19042.1165 上