как получить доступ к элементу словаря в шаблоне django?
У меня есть этот код в шаблоне, который я хотел бы распечатать количество голосов, которые получил каждый выбор. голоса-это просто словарь, а выбор модели объекта.
{% for choice in choices %}
{{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
он вызывает исключение с сообщением "не удалось обработать остаток"
8 ответов
чтобы повторить / расширить комментарий Джеффа, я думаю, что вы должны стремиться просто к свойству в своем классе выбора, которое вычисляет количество голосов, связанных с этим объектом:
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 %}
тег шаблона, имхо немного перебор для этого решения,но это не ужасное решение. Цель шаблонов в Django-изолировать вас от кода в ваших шаблонах и наоборот.
Я попробуйте вышеуказанный метод и посмотрите, что SQL ORM генерирует, поскольку я не уверен в верхней части моей головы, будет ли он предварительно кэшировать свойства и просто создавать подвыбор для свойства или если он будет итеративно / по требованию запускать запрос для вычисления подсчета голосов. Но если он генерирует ужасные запросы, вы всегда можете заполнить свойство в своем представлении данными, которые вы собрали сами.
choices = {'key1':'val1', 'key2':'val2'}
вот шаблон:
<ul> {% for key, value in choices.items %} <li>{{key}} - {{value}}</li> {% endfor %} </ul>
по сути, .items
- ключевое слово Django, которое разбивает словарь на список пар (ключ, значение). Это позволяет выполнять итерацию по словарю в шаблоне Django.
вы можете использовать точечную нотацию:
Dot lookups можно суммировать как это: когда система шаблонов встречи точку в имени переменной, он пытается выполнить следующие запросы: этот приказ:
- Поиск словаря (например, foo["bar"])
- Поиск атрибутов (например, foo.бар)
- вызов метода (например, foo.bar ())
- список-поиск индекса (например, foo[2])
система использует первый тип поиска эта работа. Это логика короткого замыкания.
вам нужно найти (или определить) тег шаблона "get", например,здесь.
определение тега:
@register.filter
def hash(h, key):
return h[key]
и он используется как:
{% for o in objects %}
<li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
похоже на ответ @russian_spy:
<ul>
{% for choice in choices.items %}
<li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
Это может быть подходящим для разбиения более сложных словарей.
В идеале вы должны создать метод на объекте выбора, который оказался в голосах, или создать связь между моделями. Тег шаблона, который выполнял поиск словаря, также будет работать.
django_template_filter имя фильтра get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}
Использовать Элементы Словаря
{% for key, value in my_dictionay.items %}
<li>{{ key }} : {{ value }}</li>
{% endfor %}