Как итерировать dict в шаблоне, содержащем ключевые именованные элементы?
<
{% for k, v in d.items %}
items
a.b
a[b]
getattr(a,b)
Каков был бы хороший способ решить эту проблему? Я уже знаю, что могу написать фильтр, который просто возвращает list(d.items())
, но это кажется мне неправильным/расточительным. Есть ли какие-то другие возможности решить эту проблему?
Нет, вероятно, вам следует переписать словари, чтобы не включать 'items'
в качестве ключа, так что, возможно, 'children'
является альтернативой.
Это указано в {% url … %}
документации [Django-doc]:
Помните, что для оператора dot поиск ключа в словаре имеет приоритет над поиском метода. Поэтому, если словарь данных содержит ключ с именем
'items'
,data.items
вернетdata['items']
, а неdata.items()
. Избегайте добавления ключей, названных как методы словаря, если вы хотите использовать эти методы в шаблоне (items
,values
,keys
и т. д.)
Поэтому, вероятно, лучше не использовать items
в качестве ключа. Вы можете "переназначить" их на другую клавишу с помощью:
{'children' if k == 'items' else k: v for k, v in data.items()}
Один из способов решения этой проблемы - обернуть словарь в другой объект и раскрыть все необходимые методы через него:
class DictionaryWrapper:
def __init__(self, d):
self.d = d
def items(self):
return self.d.items()
# Expose any other appropriate methods as needed
# Example view
def your_view(request):
# Other code
d = ...
d = DictionaryWrapper(d)
context = {"d": d}
return render(request, "your_template.html", context)
Затем в своем шаблоне вы можете сделать то, что делали раньше:
{% for k, v in d.items %}
Если вам нужен прямой доступ к словарю в шаблоне, вы можете использовать d.d
для этой цели.
Другим решением может быть создание пользовательского шаблонного тега/фильтра, который будет получать подходящие итерабельные переменные.