Как итерировать 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 для этой цели.

Другим решением может быть создание пользовательского шаблонного тега/фильтра, который будет получать подходящие итерабельные переменные.

Вернуться на верх