Шаблон Django не может зациклить defaultdict - PullRequest
64 голосов
/ 22 января 2011
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 ]

78 голосов
/ 11 октября 2012

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

new_data.default_factory = None

Объяснение

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

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

41 голосов
/ 22 января 2011

попробовать:

dict(new_data)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...