2016-04-14 117 views
1

我有這個功能,正在向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

回答

1

需要初始化字典並調用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

2

這是因爲你宣佈

cardData = {} 

你的循環之外,同一個實例被寫在和相同的字典被推到陣列。在最後一次迭代中,整個列表都有姓氏。

在循環中移動該聲明。或者更好,只需將每張卡片追加到列表中。 您的縮進也是錯誤的。您只會將最後一個實例放在結果列表中。這樣做:

for cards in jsonList: 
    data.append(cards)