2011-01-21 20 views
59
import collections 

data = [ 
    {'firstname': 'John', 'lastname': 'Smith'}, 
    {'firstname': 'Samantha', 'lastname': 'Smith'}, 
    {'firstname': 'shawn', 'lastname': 'Spencer'}, 
] 

new_data = collections.defaultdict(list) 

for d in data: 
    new_data[d['lastname']].append(d['firstname']) 

print new_data 

Çıktı İşte: BuradaDjango şablon olamaz döngü defaultdict

defaultdict(<type 'list'>, {'Smith': ['John', 'Samantha'], 'Spencer': ['shawn']}) 

ve şablon var:

{% for lastname, firstname in data.items %} 
    <h1> {{ lastname }} </h1> 
    <p> {{ firstname|join:", " }} </p> 
{% endfor %} 

Ama şablonunda döngü çalışmaz. Hiçbir şey ortaya çıkmaz. Bana bir hata bile vermiyor. Bunu nasıl düzeltebilirim?

<h1> Smith </h1> 
<p> John, Samantha </p> 

<h1> Spencer </h1> 
<p> shawn </p> 
+0

Sözlüğü, söz konusu şablonu şablona göre koyan kodu göstermediniz. Bunun doğru olduğundan emin misin? –

+0

Evet, diğer her şey döngü dışında doğru bir şekilde işleniyor. – user216171

cevap

36

deneyin: Böyle firstname birlikte soyadını, bir şey göstermek gerekiyordu

dict(new_data) 

ve Python 2'de daha iyidir

yerine iteritems kullanmak items :)

+2

Çalıştığı gibi basit bir şeye inanamıyorum. Çok teşekkürler! – user216171

+6

Aslında django karşı bir hata olarak dosyalanmıştı: https://code.djangoproject.com/ticket/16335 ama sadece iyi bir çözüm ortaya çıktı [şimdi] [docs] 'de gösterildiği gibi, bir dict dönüştürmek için gerçekten oldu https://docs.djangoproject.com/en/dev/topics/templates/#variables) ve [changeset] 'de görülebilir (https://code.djangoproject.com/ticket/16335) – Stefano

70

Yeni değerler eklendikten sonra varsayılanı varsayılan ayar özelliğini devre dışı bırakarak yeni bir dict kopyasını önleyebilirsiniz:

new_data.default_factory = None 

template variable resolution algorithm in Djangodefaultdict (liste) kullanıldığında boş bir listeye giderir new_data.items birinci new_data['items'] olarak çözmeye çalışır

açıklanması.

sonra new_data.items() arayarak kadar çözünürlük çabalarını sürdürdüler boş listeye varsaymak devre dışı bırakmak ve Django new_data['items'] başarısız olması için, default_factory attribute of defaultdict Yok ayarlanabilir.

+6

+1 - Bu bir Özellikle büyük bir sözlük seti ile seçilen cevaptan çok daha verimli. – keithhackbarth

+0

Harika cevap, açıklama, altta yatan sorunu anlamada yardımcı oldu! – Blackeagle52

+0

Bunu ekleyebilirim {% k için detauldictvar%}} defaultdict'in öğesinde default_factory değerini None olarak ayarlamadan yinelemenize izin verir. Sebastien açıklamasının şimdi neden olduğunu anlayabiliyorum :-) – RobM

İlgili konular