web-dev-qa-db-ja.com

Jinja2で配列が空でないかどうかを確認します

変数textsindex.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でこれを何と言いますか?

33
daniel__

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 %}
21
Tadeck

プレゼンス( "defined-ness"?)をテストするには、is definedを使用します。

現在のリストが空でないことをテストするには、リスト自体を条件として使用します。

例には当てはまらないようですが、この形式の空のチェックは便利ですループ以外のものが必要な場合

人工的な例は

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

私はあなたの最善の策は length()関数 を介して 配列の長さ を見ることとdefined()チェックの組み合わせだと思います:

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

ドキュメント で述べたように、次のように書くこともできます:

{% 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が空の場合の両方を処理します。

6
Mathieu Bridon

textsを定義できても、空の文字列である単一のリスト要素を含む可能性があります。例えば:

texts = ['']

この場合、textsが定義されているかどうかをテストすると真の結果が得られるため、代わりに最初の要素をテストする必要があります。

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

また、|lengthフィルターと組み合わせて、エレメントが1つだけであることを確認することもできます。

2
foobrew

これはきちんとしたシンプルなソリューションで、私にとってはうまくいきました!

{% if texts is defined and texts[0] is defined %}
    ...
{% endif %}
1
sonictolfa