Шаблон Django, как найти значение словаря с переменной

mydict = {"key1":"value1", "key2":"value2"}

Обычным способом поиска значения словаря в шаблоне Django является {{ mydict.key1 }}, {{ mydict.key2 }}. Что делать, если ключ представляет собой переменную цикла? то есть:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAME терпит неудачу. Как это исправить?

Ответ 1

Напишите настраиваемый фильтр шаблонов:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(я использую .get, так что, если ключ отсутствует, он возвращает none.Если вы выполняете dictionary[key], он поднимет KeyError.)

использование:

{{ mydict|get_item:item.NAME }}

Ответ 2

Извлеките ключ и значение из словаря в цикле:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

Мне это легче читать, и это позволяет избежать необходимости в специальном кодировании. Обычно мне нужен ключ и значение внутри цикла.

Ответ 3

Вы не можете по умолчанию. Точка - это разделитель/триггер для поиска атрибутов/поиска ключей/слайса.

Точки имеют особое значение в рендеринге шаблона. Точка в переменной имя означает поиск. В частности, когда система шаблонов встречает точку в имени переменной, пытается следующие поиски, в следующем порядке:

  • Поиск по словарю. Пример: foo ["bar"]
  • Поиск атрибутов. Пример: foo.bar
  • Поиск по индексу списка. Пример: foo [bar]

Но вы можете создать фильтр, который позволит вам передать аргумент:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}

Ответ 4

У меня была аналогичная ситуация. Однако я использовал другое решение.

В моей модели я создаю свойство, которое выполняет поиск по словарю. В шаблоне я затем использую свойство.

В моей модели: -

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

В моем шаблоне: -

The state is: {{ item.state_ }}

Ответ 5

Для создания файла python с именем template_filters.py в моем приложении с содержимым ниже было выполнено задание

# coding=utf-8
from django.template.base import Library

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

использование похоже на то, что сказал culebrón:

{{ mydict|get_item:item.NAME }}

Ответ 6

env: django 2.1.7

просмотр:

dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})

шаблон:

{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>