Еквивалент на използването на if .. else като израз в езика за шаблони на Django

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

Доколкото мога да преценя, таговете {% if %} ... {% else %} ... {% endif %} на Django Template Language са еквивалентни на първите. Въпреки това се чудех дали мога по някакъв начин да внедря последното, за да преработя кода по-долу:

<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