Шаблон Django, как искать значение словаря с переменной - PullRequest
194 голосов
/ 03 ноября 2011
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 не удается.Как это исправить?

Ответы [ 6 ]

309 голосов
/ 03 ноября 2011

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

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

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

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

{{ mydict|get_item:item.NAME }}
45 голосов
/ 12 июля 2015

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

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

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

29 голосов
/ 03 ноября 2011

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

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

  • Поиск в словаре.Пример: 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 }}
2 голосов
/ 29 июня 2017

Для меня создание файла 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)

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

{{ mydict|get_item:item.NAME }}
2 голосов
/ 07 октября 2016

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

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

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

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

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

The state is: {{ item.state_ }}
0 голосов
/ 06 марта 2019

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...