Django在模板中迭代Json响应
问题描述:
我有这个功能,正在向api请求get
。响应会回来并预期,并且我将打印出返回到终端的对象的每个名称。但是,当我使用相同的循环打印模板中的数据时,只有最后一个对象的名称正在模板页面上呈现。Django在模板中迭代Json响应
我在想也许我没有正确执行我的循环,但如果这是真的,为什么我的数据在终端输出正确。
在我看来
def graphs(request):
if request.user.is_authenticated():
data = []
r = requests.get('https://api.deckbrew.com/mtg/cards')
jsonList = r.json()
cardData = {}
for cards in jsonList:
cardData['name'] = cards['name'] # Only last object name
print(cards['name']) # Prints to termainl correct
data.append(cardData)
return render(request, 'graphs/graphs.html', {'data': data})
else:
return redirect('index')
这是我的模板#我只得到了最后一个对象命名
{% for card in data %}
<tr>
<td>{{ card.name }}</td>
</tr>
{% endfor %}
当我移动data.append里面的for循环它追加同名列表中每次有响应时都有一张卡片。
for cards in jsonList:
cardData['name'] = cards['name']
print(cards['name'])
data.append(cardData)
答
需要初始化字典并调用append()
循环内:
for cards in jsonList:
cardData = {}
cardData['name'] = cards['name']
data.append(cardData)
或者更短,速度更快,具有列表理解:
data = [{'name': cards['name']} for cards in jsonList]
答
这是因为你宣布
cardData = {}
你的循环之外,同一个实例被写在和相同的字典被推到阵列。在最后一次迭代中,整个列表都有姓氏。
在循环中移动该声明。或者更好,只需将每张卡片追加到列表中。 您的缩进也是错误的。您只会将最后一个实例放在结果列表中。这样做:
for cards in jsonList:
data.append(cards)
谢谢你这个问题......叹气。这总是荒谬的。我会在6分钟后再接受。谢谢。 – wuno
是你更简单的方法。请与我联系,以便将来我的生活会更轻松。我可以在响应中为每个字段创建一个新的列表理解?名称|键入|生命点等?我在哪里可以阅读如何处理复杂的json,如“类型”:[ “生物”,“飞行物”,“摩尔” ], – wuno
@wuno你可以阅读更多关于列表解析[这里](https:// docs。 python.org/2/tutorial/datastructures.html#list-comprehensions)。如果有更多的密钥需要处理,比如:'data = [{'name':cards ['name'],“type”:cards [“type”]} – alecxe