Aby powtórzyć / rozszerzyć komentarz Jeffa, myślę, że powinieneś dążyć do po prostu własności w klasie Choice, która oblicza liczbę głosów związanych z tym obiektem:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice=self).count()
votes = property(calculateVotes)
Następnie w szablonie możesz wykonać:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
Tag szablonu, to IMHO trochę przesada w przypadku tego rozwiązania, ale nie jest to również okropne rozwiązanie. Celem szablonów w Django jest izolowanie użytkownika od kodu w szablonach i odwrotnie.
Wypróbuję powyższą metodę i zobaczę, co SQL generuje ORM, ponieważ nie jestem pewien, czy z góry głowy buforuje właściwości i po prostu tworzy podselekcję dla właściwości lub czy będzie iteracyjnie / on- uruchom zapytanie, aby obliczyć liczbę głosów. Ale jeśli generuje okropne zapytania, zawsze możesz wypełnić właściwość w swoim widoku danymi, które sam zebrałeś.
.items
wywołaniem (jak pokazano na jednej z pozostałych odpowiedzi) jest rozwiązaniem znacznie prostszym.Oto szablon:
Zasadniczo
.items
jest słowem kluczowym Django, które dzieli słownik na listę(key, value)
par, podobnie jak metoda Python.items()
. Umożliwia to iterację słownika w szablonie Django.źródło
items
jest to wywołanie słownika w języku Python, a nie słowo kluczowe Django. Jak zauważa Alex Martelli, jest to w zasadzie to samo coiteritems
. Jak odpowiedział Wilhelm, wyszukiwanie słownikowe zajmuje 3 miejsce przed wyszukiwaniem kropek. Jeśli masz w słowniku element o nazwie'items'
, otrzymasz tę wartość z powrotem zamiast listy krotek. Aby przetestować: dodaj{'items':'oops'}
do słownika, a otrzymasz wypunktowaną listę liter od słowa „oops”możesz użyć notacji kropkowej:
źródło
my_dict[1][2]
szablonu:my_dict.1.2
d.key.1
- zwróć uwagę na drugą.
Musisz znaleźć (lub zdefiniować) znacznik szablonu „pobierz”, na przykład tutaj .
Definicja znacznika:
I jest używany jak:
źródło
h.get(key,'default_value')
ze względu na KeyErrorUżyj elementów słownika:
źródło
django_template_filter nazwa filtra get_value_from_dict
źródło
Podobnie do odpowiedzi @russian_spy:
Może to być przydatne do rozkładania bardziej złożonych słowników.
źródło
Idealnie byłoby stworzyć metodę na obiekcie wyboru, który znalazł się w głosach, lub stworzyć relację między modelami. Działa również tag szablonu, który przeprowadził wyszukiwanie słownika.
źródło