Um Jeffs Kommentar zu wiederholen, sollten Sie meiner Meinung nach einfach eine Eigenschaft in Ihrer Choice-Klasse anstreben, die die Anzahl der mit diesem Objekt verbundenen Stimmen berechnet:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice = self).count()
votes = property(calculateVotes)
Und dann können Sie in Ihrer Vorlage Folgendes tun:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
Das Template-Tag ist meiner Meinung nach ein bisschen übertrieben für diese Lösung, aber es ist auch keine schreckliche Lösung. Das Ziel von Vorlagen in Django ist es, Sie vom Code in Ihren Vorlagen zu isolieren und umgekehrt.
Ich würde die obige Methode ausprobieren und sehen, welche SQL der ORM generiert, da ich nicht sicher bin, ob die Eigenschaften vorab zwischengespeichert und nur eine Unterauswahl für die Eigenschaft erstellt werden oder ob sie iterativ / on- Führen Sie die Abfrage aus, um die Stimmenzahl zu berechnen. Wenn jedoch grausame Abfragen generiert werden, können Sie die Eigenschaft in Ihrer Ansicht jederzeit mit Daten füllen, die Sie selbst gesammelt haben.
.items
Aufruf (wie in einer der anderen Antworten dargestellt) ist eine weitaus einfachere Lösung.Hier ist die Vorlage:
Grundsätzlich
.items
handelt es sich um ein Django-Schlüsselwort, das ein Wörterbuch in eine Liste von(key, value)
Paaren aufteilt, ähnlich wie die Python-Methode.items()
. Dies ermöglicht die Iteration über ein Wörterbuch in einer Django-Vorlage.quelle
items
handelt es sich um einen Python-Methodenaufruf im Wörterbuch, nicht um ein Django-Schlüsselwort. Wie Alex Martelli betont, ist es im Grunde das gleiche wieiteritems
. Wie Wilhelm antwortete, hat die Wörterbuchsuche bei Punktsuchen den 3. Platz. Wenn Sie einen Eintrag in Ihrem Wörterbuch haben'items'
, erhalten Sie diesen Wert anstelle einer Liste von Tupeln zurück. Zum Testen:{'items':'oops'}
Fügen Sie Ihrem Wörterbuch hinzu, und Sie erhalten eine Liste mit Buchstaben mit Aufzählungszeichen aus dem Wort 'oops'Sie können die Punktnotation verwenden:
quelle
my_dict[1][2]
Vorlagencode:my_dict.1.2
d.key.1
- beachten Sie die zweite.
Sie müssen beispielsweise hier ein 'get'-Vorlagen-Tag finden (oder definieren) .
Die Tag-Definition:
Und es wird verwendet wie:
quelle
h.get(key,'default_value')
wegen KeyErrorVerwenden Sie Wörterbuchelemente:
quelle
django_template_filter Filtername get_value_from_dict
quelle
Ähnlich der Antwort von @russian_spy:
Dies könnte geeignet sein, komplexere Wörterbücher aufzuschlüsseln.
quelle
Im Idealfall erstellen Sie eine Methode für das Auswahlobjekt, das sich in Abstimmungen befindet, oder erstellen eine Beziehung zwischen den Modellen. Ein Vorlagen-Tag, das die Wörterbuchsuche durchführte, würde ebenfalls funktionieren.
quelle