変数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でこれを何と言いますか?
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 %}
プレゼンス( "defined-ness"?)をテストするには、is defined
を使用します。
現在のリストが空でないことをテストするには、リスト自体を条件として使用します。
例には当てはまらないようですが、この形式の空のチェックは便利ですループ以外のものが必要な場合。
人工的な例は
{% if (texts is defined) and texts %}
The first text is {{ texts[0] }}
{% else %}
Error!
{% endif %}
私はあなたの最善の策は length()関数 を介して 配列の長さ を見ることとdefined()チェックの組み合わせだと思います:
{% if texts is defined and texts|length > 0 %}
...
{% endif %}
ドキュメント で述べたように、次のように書くこともできます:
{% 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
が空の場合の両方を処理します。
texts
を定義できても、空の文字列である単一のリスト要素を含む可能性があります。例えば:
texts = ['']
この場合、texts
が定義されているかどうかをテストすると真の結果が得られるため、代わりに最初の要素をテストする必要があります。
{% if texts[0] != '' %}
..code here..
{% endif %}
また、|length
フィルターと組み合わせて、エレメントが1つだけであることを確認することもできます。
これはきちんとしたシンプルなソリューションで、私にとってはうまくいきました!
{% if texts is defined and texts[0] is defined %}
...
{% endif %}