2016-04-14 21 views
1

get ile bir api isteği yapan bu işleve sahibim. Yanıt geri geliyor ve bekleniyor ve terminale geri gönderilen nesnelerin her bir adını yazdırıyorum. Ancak şablondaki verileri yazdırmak için aynı döngüde kullandığımda, şablon sayfasında yalnızca son nesnenin adı işleniyor.Django Yinelenen Json Yanıtı Şablon İçinde

Belki de for döngüsümü düzgün bir şekilde yürütmüyorum diye düşünüyordum ama bu doğru olsaydı neden veri çıkışım terminalde doğru çıktı? Ben for döngüsü içinde data.append taşıdığınızda Ben sadece son nesneleri

{% for card in data %} 
<tr> 
    <td>{{ card.name }}</td> 
</tr> 
    {% endfor %} 

isim olsun

Bu benim şablon # içindedir
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') 

Bence

aynı ad ekler her seferinde listeye yanıtta bir kart var. Eğer döngü dışında

cardData = {} 

ilan ederek aynı örneği üzerinde yazılı olan ve aynı sözlüğü dizinin üzerine itiliyor çünkü

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

enter image description here

cevap

1

Sen sözlüğü başlatmak ve döngü iç append()çağırmanız gerekir

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

Teşekkür ederim bu sorun oldu ... Sigh. her zaman saçma bir şeydir. 6 dakika sonra kabul edeceğim. Teşekkür ederim. – wuno

+0

Evet, daha basit yol. Lütfen bana ulaşın, böylece gelecekte hayatım daha kolay olacak. Böyle bir cevapta her alan için yeni bir liste kavrayışı oluşturabilir miyim? isim | tipi | hit noktaları vb? Karmaşık jsonu "türler" gibi nasıl kullanabileceğimi nerede okuyabilirim: [ "yaratık", "uçan", "mucizeler" ], – wuno

+0

@wuno liste anlamalarıyla ilgili daha fazla bilgiyi buradan edinebilirsiniz [burada] (https: // docs. python.org/2/tutorial/datastructures.html#list-comprehensions). Eğer işlemek istediğiniz daha fazla tuş varsa, sadece şunu yapın: e-posta: 'data = [{'name': kartlar ['name']," type ": kartlar [" type "]} jsonList'teki kartlar için) – alecxe

2

öyle. Son yinelemede, tüm listenin soyadı vardır.

Bu bildirimi döngü içinde taşıyın. Ya da daha iyisi, her kartı sadece listeye ekleyin. Girintiniz de yanlış. Son örneği yalnızca sonuç listesine koydu. Bunu yapın: Bir liste anlama ile

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

Veya daha kısa (ve daha hızlı):

for cards in jsonList: 
    data.append(cards)