Чтобы повторить / расширить комментарий Джеффа, я думаю, что вы должны стремиться к простому свойству в классе Choice, которое вычисляет количество голосов, связанных с этим объектом:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice=self).count()
votes = property(calculateVotes)
И тогда в вашем шаблоне вы можете сделать:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
Тег шаблона, IMHO, немного излишним для этого решения, но это тоже не страшное решение. Цель шаблонов в Django - изолировать вас от кода в ваших шаблонах и наоборот.
Я попробую описанный выше метод и посмотрю, какой SQL генерирует ORM, так как я не уверен, что он будет предварительно кэшировать свойства и просто создаст отбор для свойства или будет итеративно По требованию запустите запрос для подсчета голосов. Но если он генерирует жестокие запросы, вы всегда можете заполнить свойство по вашему мнению данными, которые вы собрали самостоятельно.
.items
вызовом (как показано в одном из других ответов) является гораздо более простым решением.Вот шаблон:
По сути,
.items
это ключевое слово Django, которое разбивает словарь на список(key, value)
пар, как и метод Python.items()
. Это позволяет выполнять итерацию по словарю в шаблоне Django.источник
items
это вызов метода Python для словаря, а не ключевое слово Django. Как указывает Алекс Мартелли, это в основном то же самое, что иiteritems
. Как ответил Вильгельм, поиск по словарю занимает третье место по количеству точечных поисков. Если в вашем словаре есть элемент с именем'items'
, вы получите это значение вместо списка кортежей. Чтобы проверить: добавьте{'items':'oops'}
в свой словарь, и вы получите маркированный список букв от слова «упс»Вы можете использовать точечную запись:
источник
my_dict[1][2]
шаблона:my_dict.1.2
d.key.1
- обратите внимание на вторую.
Вам нужно найти (или определить) тег шаблона 'get', например, здесь .
Определение тега:
И это используется как:
источник
h.get(key,'default_value')
из-за KeyErrorИспользуйте элементы словаря:
источник
имя фильтра django_template_filter get_value_from_dict
источник
Аналогично ответу @russian_spy:
Это может подойти для разбивки более сложных словарей.
источник
В идеале вы должны создать метод для объекта выбора, который окажется в голосовании, или создать связь между моделями. Тег шаблона, который выполнил поиск по словарю, тоже подойдет.
источник