Значение переменной шаблона Django для сравнения строковых литералов не выполняется

У меня есть следующий код в моем шаблоне, который должен сравнивать значение watchinstance.shift, которое может быть либо "ДЕНЬ", либо "НОЧЬ", в буквальную строку "ДЕНЬ". Сравнение всегда терпит неудачу.

{% for watchinstance in watchinstance_list %}
    {% if watchinstance.shift == "DAY" %}
        <p>shift is DAY</p>
    {% endif %}
{% endfor %}

Использование ifequal тоже не работает:

{% for watchinstance in watchinstance_list %}
    {% ifequal watchinstance.shift "DAY" %}
        <p>shift is DAY</p>
    {% endifequal %}
{% endfor %}

Однако просто вызов {{ watchinstance.shift }} работает так, как ожидалось:

{% for watchinstance in watchinstance_list %}
    {{ watchinstance.shift }}
{% endfor %}

возвращает DAYs и NIGHT.

Я проверил, возвращает ли watchinstance.shift лишние символы, и это не похоже на то, что он делает... Что еще я могу здесь пропустить?

Ответы

Ответ 1

Несколько возможностей:

  • Строка .shift имеет дополнительные пробелы. Используйте это для двойной проверки:

    {% for watchinstance in watchinstance_list %}
        X{{ watchinstance.shift }}X
    {% endfor %}
    
  • Атрибут .shift - это не строка, а объект, который привязывается к "Дню" или "НОЧЬ". В этом случае подстановка переменных в {{ watchinstance.shift }} будет выглядеть так же, как строка, но сравнение в {% ifequal watchinstance.shift "DAY" %} не получится.

Ответ 2

Итак, после поиска Django docs в течение 2 часов, я наконец нашел способ заставить его работать:

{% if watchinstance.shift|stringformat:"s" == "DAY"  %}