как получить доступ к элементу словаря в шаблоне 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 %}