201 votes

comment accéder à l'élément dictionnaire dans le modèle django?

J'ai ce code dans le modèle, que je voudrais imprimer le nombre de votes que chaque choix a eu. votes est juste un dictionnaire alors que les choix sont des objets modèles.

 {% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
 

il soulève une exception avec ce message "Impossible d'analyser le reste" je l'ai googlé et jusqu'à présent pas de chance.

Merci d'avance.

312voto

russian_spy Points 1196
 choices = {'key1':'val1', 'key2':'val2'}
 

Voici le modèle:

<ul>
{% pour la clé, valeur dans choices.items%} 
  <li> {{key}} - {{value}} </ li>
 {% endfor%}
</ ul>

Fondamentalement, ".items" est un mot clé Django qui divise un dictionnaire en une liste de paires (clé, valeur). Cela permet une itération sur un dictionnaire dans un modèle Django.

201voto

Wilhelm Points 2542

vous pouvez utiliser la notation par points:

Point les recherches peuvent être résumées comme ce: lorsque le système de template rencontres d'un point dans un nom de variable, il tente à la suite de recherches, dans cet ordre:

  • Recherche dans le dictionnaire (par exemple, foo["bar"])
  • Attribut de recherche (par exemple, foo.bar)
  • Appel de la méthode (par exemple, foo.bar())
  • Liste de l'index de recherche (par exemple, foo[2])

Le système utilise le premier type de recherche qui fonctionne. C'est de court-circuit de la logique.

65voto

John Ewart Points 676

Echo / étendre sur Jeff commentaire, ce que je pense que vous devriez viser est simplement une propriété dans votre Choix de classe qui calcule le nombre de voix associée à 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 le faire:

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}

La balise de modèle, est à mon humble avis un peu overkill pour cette solution, mais ce n'est pas terrible une solution. L'objectif de modèles dans Django est d'isoler vous de code dans vos templates et vice-versa.

Je vais essayer la méthode ci-dessus et voir ce que SQL l'ORM génère que je ne suis pas sûr du haut de ma tête si elle sera pré-cache les propriétés et il suffit de créer une sous-sélection pour le bien ou s'il sera de manière itérative sur demande exécutez la requête pour calculer le décompte des voix. Mais si elle génère atroce requêtes, vous pouvez toujours remplir le bien de votre point de vue avec les données que vous avez collectées vous-même.

31voto

Ned Batchelder Points 128913

Vous devez trouver (ou définir) une balise "get", par exemple ici .

3voto

Jeff Ober Points 3314

Idéalement, vous devez créer une méthode sur l'objet de choix qui se trouve dans les votes ou créer une relation entre les modèles. Une balise de modèle qui effectuait la recherche de dictionnaire fonctionnerait également.

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