Проверьте, не пуст ли массив в Jinja2

Мне нужно проверить, определена ли переменная texts в index.html.

Если переменная определена и не пуста, я должен визуализировать цикл. В противном случае я хочу показать сообщение об ошибке {{error}}.

В основном это в PHP

if (isset($texts) && !empty($texts)) {
    for () { ... }
}
else {
    print $error;
}

index.html

{% for text in texts %} 
    <div>{{error}}</div>
    <div class="post">
        <div class="post-title">{{text.subject}}</div>
        <pre class="post-content">{{text.content}}</pre>
    </div>
{% endfor %}

Как сказать это на jinja2?


person daniel__    schedule 08.05.2012    source источник


Ответы (7)



Чтобы проверить наличие («определенность»?), Используйте is defined.

Чтобы проверить, не является ли текущий список пустым, используйте сам список в качестве условия.

Хотя это не похоже на ваш пример, эта форма проверки пустоты полезна , если вам нужно что-то другое, кроме цикла.

Искусственный пример может быть

{% if (texts is defined) and texts %}
    The first text is {{ texts[0] }}
{% else %}
    Error!
{% endif %}
person phs    schedule 05.05.2015

Я думаю, ваш лучший выбор - это комбинация проверки defined () с просмотром длины массива с помощью функции length ():

{% if texts is defined and texts|length > 0 %}
    ...
{% endif %}
person andyfeller    schedule 25.07.2016
comment
texts|length > 0 эквивалентно texts - пустой список в логическом тесте оценивается как false. - person Davor Cubranic; 27.01.2017

Как упоминалось в документации, вы также можете написать:

{% for text in texts %}
    <div class="post">
        <div class="post-title">{{text.subject}}</div>
        <pre class="post-content">{{text.content}}</pre>
    </div>
{% else %}
    <div>{{ error }}</div>
{% endfor %}

Он обрабатывает как случай, когда texts не определен, так и случай, когда texts пусто.

person Mathieu Bridon    schedule 07.04.2017

Это изящное и простое решение, которое мне понравилось!

{% if texts is defined and texts[0] is defined %}
    ...
{% endif %}
person sonictolfa    schedule 10.08.2018

Возможно, что texts может быть определен, но содержать единственный элемент списка, который является пустой строкой; Например:

texts = ['']

В этом случае проверка, определено ли texts, даст истинный результат, поэтому вам следует вместо этого протестировать первый элемент:

{% if texts[0] != '' %}
    ..code here..
{% endif %}

Вы также можете объединить это с фильтром |length, чтобы убедиться, что в нем есть только один элемент.

person foobrew    schedule 09.06.2016

Вот что сработало для моего варианта использования в моем приложении Django:

Мне нужно было передать набор запросов в качестве контекста в шаблон html и отобразить блок только в том случае, если набор запросов имел значения

Набор запросов:

events = Event.objects.filter(schedule_end__gte=date.today()).order_by('-created_at')

Пройден контекстный словарь следующим образом:

{ "events" : events }

HTML-шаблон

{% if events %}
  <h3>Upcoming Events</h3>
  <ul>
    {% for event in events %}
    <li><h4>{{ event.title }}</h4></li>
    {% endfor %}
  </ul>
{% endif %}
person Amal Vijayan    schedule 22.11.2020