Pour faire écho / prolonger le commentaire de Jeff, je pense que vous devriez viser simplement une propriété de votre classe Choice qui calcule le nombre de votes associés à cet objet:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice=self).count()
votes = property(calculateVotes)
Et puis dans votre modèle, vous pouvez faire:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
La balise de modèle, à mon humble avis, est un peu exagérée pour cette solution, mais ce n'est pas non plus une solution terrible. Le but des modèles dans Django est de vous isoler du code dans vos modèles et vice-versa.
J'essaierais la méthode ci-dessus et verrais ce que SQL l'ORM génère car je ne suis pas sûr du haut de ma tête s'il pré-cache les propriétés et crée simplement une sous-sélection pour la propriété ou s'il sera itérativement / sur- demande exécutez la requête pour calculer le nombre de votes. Mais si cela génère des requêtes atroces, vous pouvez toujours remplir la propriété dans votre vue avec les données que vous avez collectées vous-même.
.items
appel (comme illustré dans l'une des autres réponses) est une solution beaucoup plus simple.Voici le modèle:
Fondamentalement,
.items
est un mot-clé Django qui divise un dictionnaire en une liste de(key, value)
paires, un peu comme la méthode Python.items()
. Cela permet l'itération sur un dictionnaire dans un modèle Django.la source
items
est un appel de méthode Python sur le dictionnaire, pas un mot clé Django. Comme le souligne Alex Martelli, c'est fondamentalement le même queiteritems
. Comme Wilhelm a répondu, la recherche dans le dictionnaire est la troisième en priorité pour les recherches de points. Si vous avez un élément dans votre dictionnaire nommé'items'
, vous récupérerez cette valeur au lieu d'une liste de tuples. Pour tester: ajoutez{'items':'oops'}
à votre dictionnaire et vous obtiendrez une liste à puces des lettres du mot 'oops'vous pouvez utiliser la notation par points:
la source
my_dict[1][2]
modèle:my_dict.1.2
d.key.1
- notez la seconde.
Vous devez trouver (ou définir) une balise de modèle «get», par exemple ici .
La définition du tag:
Et il est utilisé comme:
la source
h.get(key,'default_value')
cause de KeyErrorUtiliser les éléments du dictionnaire:
la source
django_template_filter nom du filtre get_value_from_dict
la source
Similaire à la réponse de @russian_spy:
Cela peut convenir pour décomposer des dictionnaires plus complexes.
la source
Idéalement, vous créeriez une méthode sur l'objet de choix qui se trouvait dans les votes, ou créeriez une relation entre les modèles. Une balise de modèle qui effectue la recherche dans le dictionnaire fonctionnera également.
la source