81 votes

Le modèle Django ne peut pas mettre en boucle 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
 

Voici le résultat:

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

et voici le modèle:

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

Mais la boucle dans mon modèle ne fonctionne pas. Rien ne se présente. Cela ne me donne même pas une erreur. Comment puis-je réparer cela? Il est censé afficher le nom de famille avec le prénom, quelque chose comme ceci:

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

<h1> Spencer </h1>
<p> shawn </p>
 

105voto

Vous pouvez éviter de le copier à un nouveau dict par la désactivation de la fonction défaillante de defaultdict une fois que vous avez terminé l'insertion de nouvelles valeurs:

new_data.default_factory = None

Explication

La variable de modèle de résolution de l'algorithme dans Django va tenter de résoudre new_data.items comme new_data['items'] première, qui se résout à une liste vide lors de l'utilisation de defaultdict(liste).

Pour désactiver le défaut d'une liste vide et ont Django échouer sur new_data['items'] puis continuer les tentatives de règlement jusqu'à l'appel new_data.items(), le default_factory attribut de defaultdict peut être défini sur Aucun.

55voto

virhilo Points 2624

essayer:

 dict(new_data)
 

et il vaut mieux utiliser iteritems au lieu de items :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X