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
выходит из строя. Как это исправить?
Получите ключ и значение из словаря в цикле:
Я считаю, что это легче читать, и это избавляет от необходимости специального кодирования. Обычно мне все равно нужен ключ и значение внутри цикла.
источник
Вы не можете по умолчанию. Точка является разделителем / триггером для поиска атрибутов / поиска ключей / слайса.
Но вы можете создать фильтр, который позволит вам передать аргумент:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
источник
return value.get(arg)
потому что это не вызвало бы исключение KeyError, если ключ отсутствует.Для меня создание файла Python с именем
template_filters.py
в моем приложении с содержанием ниже сделал работуиспользование похоже на то, что сказал знаменитость:
источник
register = Library()
? Что оно делает ?django.template.base.Library
классе. поregister = Library()
мы создаем этот класс и использоватьfilter
функцию аннотатор внутри него , чтобы достичь нашей потребности.У меня была похожая ситуация. Однако я использовал другое решение.
В моей модели я создаю свойство, которое выполняет поиск по словарю. В шаблоне я затем использую свойство.
В моей модели: -
В моем шаблоне: -
источник
Поскольку я не могу комментировать, позвольте мне сделать это в форме ответа:
чтобы построить ответ culebrón или Yuji 'Tomita' Tomita , словарь, переданный в функцию, имеет форму строки, поэтому, возможно, используйте ast. literal_eval, чтобы сначала преобразовать строку в словарь, как в этом примере .
С этим редактированием код должен выглядеть так:
источник
Окружение: Джанго 2.2
Я поместил этот код в файл с именем template_filters.py в папке моего проекта с именем portfolioiomgr
Независимо от того, куда вы положили код фильтра, убедитесь, что в этой папке есть __init__.py
Добавьте этот файл в раздел библиотек в разделе шаблонов в файле projectfolder / settings.py. Для меня это портфолио / settings.py
В своем HTML-коде загрузите библиотеку
источник
env: django 2.1.7
Посмотреть:
шаблон:
источник
{{ dict_obj.obj.obj_name }}
в этом случае эквивалентен коду Pythondict_obj["obj"]["obj_name"]
, однако вопрос заключается в эквивалентеdict_obj[obj][obj_name]
.