Django在模板中迭代Json响应

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) 

enter image description here

需要初始化字典并调用append()循环内:

for cards in jsonList: 
    cardData = {} 
    cardData['name'] = cards['name'] 
    data.append(cardData) 

或者更短,速度更快,具有列表理解

data = [{'name': cards['name']} for cards in jsonList] 
+0

谢谢你这个问题......叹气。这总是荒谬的。我会在6分钟后再接受。谢谢。 – wuno

+0

是你更简单的方法。请与我联系,以便将来我的生活会更轻松。我可以在响应中为每个字段创建一个新的列表理解?名称|键入|生命点等?我在哪里可以阅读如何处理复杂的json,如“类型”:[ “生物”,“飞行物”,“摩尔” ], – wuno

+0

@wuno你可以阅读更多关于列表解析[这里](https:// docs。 python.org/2/tutorial/datastructures.html#list-comprehensions)。如果有更多的密钥需要处理,比如:'data = [{'name':cards ['name'],“type”:cards [“type”]} – alecxe

这是因为你宣布

cardData = {} 

你的循环之外,同一个实例被写在和相同的字典被推到阵列。在最后一次迭代中,整个列表都有姓氏。

在循环中移动该声明。或者更好,只需将每张卡片追加到列表中。 您的缩进也是错误的。您只会将最后一个实例放在结果列表中。这样做:

for cards in jsonList: 
    data.append(cards)