我有这个函数向get
的api发出请求。响应将回来并预期,我将打印出返回终端的对象的每个名称。但是当我使用相同的for循环在模板中打印数据时,只有最后一个对象的名称在模板页面上呈现。
我想也许我没有正确执行我的for循环,但如果这是真的那么为什么我的数据在终端输出正确。
在我看来
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 %}
当我在for循环中移动data.append时,每次响应中都有一张卡时,它会在列表中附加相同的名称。
for cards in jsonList:
cardData['name'] = cards['name']
print(cards['name'])
data.append(cardData)
答案 0 :(得分:2)
因为你声明了
cardData = {}
在你的循环之外并且正在写入相同的实例并且相同的字典被推送到数组上。在最后一次迭代中,整个列表都有姓氏。
在循环中移动该声明。或者更好的是,只需将每张卡附加到列表中即可。 你的缩进也是错的。您只将最后一个实例放在结果列表中。这样做:
for cards in jsonList:
data.append(cards)
答案 1 :(得分:1)
您需要初始化字典并在循环中调用append()
:
for cards in jsonList:
cardData = {}
cardData['name'] = cards['name']
data.append(cardData)
或者,甚至更短(更快),列表理解:
data = [{'name': cards['name']} for cards in jsonList]