В Django есть классный тег {% empty %}, который позволяет вам сделать следующее:
{% for item in list %}
<tr><td>{{ item }}</td></tr>
{% empty %}
<tr><td>Nothing to show!</td></tr>
{% endfor %}
что является сокращением от
{% if list %}
{% for item in list %}
<tr><td>{{ item }}</td?</tr>
{% endfor %}
{% else %}
<tr><td>Nothing to show!</td></tr>
{% endif %}
С тех пор, как я перешел на jinja, мне очень не хватало этого тега :(
Это уже существует. Используйте {% else %}
в цикле for. К сожалению, у нас было else до того, как Django создал пустой, и переименовывать его сейчас, чтобы он соответствовал семантике Django, довольно странно.
О, я вижу. Может быть, отметить это в разделе «Переключение с других механизмов шаблонов» в разделе django?
Я не вижу этого в документации по переключению . Это упоминается в структурах управления : для документации, но было бы полезно иметь его в документации по переключению...
Если list
в коде является генератором, а блоки for
и if
работают так же, как в Python, то конструкция if-for
не решает проблему. потому что генераторы всегда правдивы, плюс такая конструкция менее идиоматична, чем блок empty
.
Я не знаю, можете ли вы добавить флаг, чтобы проверить, запущен ли цикл, проверить наличие NameError: name 'item' is not defined
или добавить вспомогательную переменную в list(generator)
на уровне Jinja. Если нет, то единственное решение — добавить блок empty
или убедить разработчиков Python в том, что пустые генераторы должны быть ложными (чтобы избежать уродливой проверки путем обработки StopIteration
и «отталкивания» всплывающего элемента).
Блок else
в Jinja уже работает как блок empty
в Django. Никаких изменений здесь не требуется.
Самый полезный комментарий
Это уже существует. Используйте
{% else %}
в цикле for. К сожалению, у нас было else до того, как Django создал пустой, и переименовывать его сейчас, чтобы он соответствовал семантике Django, довольно странно.