Проверьте, нет ли массива в Jinja2 - программирование
Подтвердить что ты не робот

Проверьте, нет ли массива в 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?

4b9b3361

Ответ 1

Взгляните на документацию Jinja2 defined(): http://jinja.pocoo.org/docs/templates/#defined

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}

Является ли это достаточно ясным? В вашем случае это может выглядеть так:

{% if texts is defined %}
    {% 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 %}
{% else %}
    Error!
{% endif %}

Ответ 2

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

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

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

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

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

Ответ 3

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

{% if texts is defined and texts|length > 0 %}
    ...
{% endif %}

Ответ 4

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

{% 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 - undefined, так и случай, когда texts пуст.

Ответ 5

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

texts = ['']

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

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

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