Шаблон 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>