Django шаблон не может цикл defaultdict


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

вот вывод:

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

и вот шаблон:

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

но цикл в моем шаблоне не работает. Ничего не появляется. Это даже не дает мне ошибки. Как я могу это исправить? Он должен показывать фамилию вместе с именем, что-то вроде этого:

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

<h1> Spencer </h1>
<p> shawn </p>
2 61

2 ответа:

попробуй:

dict(new_data)

а в Python 2 лучше использовать iteritems вместо items :)

вы можете избежать копирования в новый дикт, отключив функцию по умолчанию defaultdict как только вы закончите вводить новые значения:

new_data.default_factory = None

объяснение

The шаблон переменного алгоритма разрешения в Django попытается решить new_data.items как new_data['items'] во-первых, который разрешает пустой список при использовании defaultdict (list).

чтобы отключить дефолт в пустой список и иметь Джанго не на new_data['items'] затем продолжайте попытки разрешения до вызова new_data.items() на default_factory атрибут defaultdict может быть задан нет.