Эквивалент использования if .. else в качестве выражения на языке шаблонов Django

В Python есть два способа использования if и else: либо для логического управления потоком, и в этом случае он используется с двоеточием и отступом, либо как выражение в одной строке, как описано в https://www.pythoncentral.io/one-line-if-statement-in-python-ternary-conditional-operator/.

Насколько я могу судить, теги {% if %} ... {% else %} ... {% endif %} языка шаблонов Django эквивалентны первым. Однако мне было интересно, могу ли я каким-то образом реализовать последнее для рефакторинга кода ниже:

<form action="" method="post">{% csrf_token %}
    {% for field in form %}
        {% if field.name == "checkin_type" %}
            <div class="auto-submit">
                {{ field.errors }}
                {{ field.label_tag }}
                {{ field }}
            </div>
        {% else %}
            <div>
                {{ field.errors }}
                {{ field.label_tag }}
                {{ field }}
            </div>
        {% endif %}
    {% endfor %}
    <input type="submit" value="Send message" />
</form>

Здесь я перебираю поля формы и добавляю определенный класс "auto-submit" к охватывающему элементу <div> определенного поля ("checkin_type"). Я хотел бы реорганизовать это в соответствии со следующим «псевдокодом»:

<form action="" method="post">{% csrf_token %}
    {% for field in form %}
        <div class="{% if field.name=='checkin_type'%}auto-submit{% else %}{% endif %}">
            {{ field.errors }}
            {{ field.label_tag }}
            {{ field }}
        </div>
    {% endfor %}
    <input type="submit" value="Send message" />
</form>

Другими словами, я хотел бы уменьшить повторение кода, используя операторы if...else только в определении class, используя своего рода тернарный оператор. Возможно ли это в DTL?

Кстати, если я попытаюсь загрузить шаблон с кодом выше, я получу TemplateSyntaxError:

Не удалось разобрать остаток: '=='checkin_type'' из 'field.name=='checkin_type''

Возможно, мне просто нужно правильно экранировать цитату?


person Kurt Peek    schedule 01.03.2018    source источник


Ответы (2)


Это должны быть пробелы до и после ==, и вам не нужен пустой блок {% else %}:

<div class="{% if field.name == 'checkin_type'%}auto-submit{% endif %}">
person neverwalkaloner    schedule 01.03.2018

В Django есть встроенный фильтр тегов yesno

Вы можете использовать его так:

<div class="{{ field.name|yesno:"checkin_type,''" }}">

https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#yesno

person Maverick    schedule 14.09.2020