Цикл в шаблоне Django simple_tag, возвращающий словарь

При использовании простого шаблонного тега, возвращающего словарь:

@register.simple_tag
def get_types():
    return {
        "item1": "Foo",
        "item2": "Bar",
    }

При этом не выводится ни один столбец:

{% for type in get_types.values %}
    <th>{{ type }}</th>
{% endfor %}

В то время как это делает:

{% get_types as types %}
{% for type in types.values %}
    <th>{{ type }}</th>
{% endfor %}

Есть ли способ заставить его работать без необходимости помещать временную переменную {% get_types as types %}? Большинство вопросов, которые я нашел на StackOverflow или на форумах, относятся к 2018 году или старше. Мне интересно, есть ли более чистый способ сделать это 6 лет спустя, так как я не фанат временных переменных

Нет, то, что вы хотите, на самом деле невозможно. {% tag ... %} - это то, как используется шаблонный тег. Когда человек пишет {% for .... %}, он использует шаблонный тег for.

В строке {% for type in get_types.values %} строка get_types.values оценивается Django как выражение, где он просматривает контекст, чтобы найти все необходимые переменные. Если бы это позволило нам также использовать другие шаблонные теги, то было бы неоднозначно понять, к чему относится тег шаблона или переменная.

Если вы действительно хотите этого, то альтернативой может быть создание замены для тега шаблона for и самостоятельный разбор и вызов других тегов шаблона. Пожалуйста, обратитесь к документации по дополнительным пользовательским тегам шаблонов, если вы решите пойти этим путем. На мой взгляд, это только усложнит задачу, но не принесет пользы. Проще сделать это так, как вы уже делаете.

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