Проверьте, нет ли массива в 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?
Ответы
Ответ 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
, чтобы убедиться, что он имеет только один элемент.