web-dev-qa-db-fra.com

Vérifiez si un tableau n'est pas vide dans Jinja2

Je dois vérifier si la variable texts est définie ou non dans index.html.

Si la variable est définie et non vide, je devrais rendre la boucle. Sinon, je veux afficher le message d'erreur {{error}}.

Fondamentalement, cela en 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 %}

Comment dire cela dans jinja2?

33
daniel__

Jetez un œil à la documentation de Jinja2 defined(): http://jinja.pocoo.org/docs/templates/#defined

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

Est-ce assez clair? Dans votre cas, cela pourrait ressembler à ceci:

{% 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

Pour tester la présence ("defined-ness"?), Utilisez is defined.

Pour tester qu'une liste actuelle n'est pas vide, utilisez la liste elle-même comme condition.

Bien qu'elle ne semble pas s'appliquer à votre exemple, cette forme de vérification du vide est utile si vous avez besoin d'autre chose qu'une boucle.

Un exemple artificiel pourrait être

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

Je pense que votre meilleur pari est une combinaison de vérifications définies () et de regarder la longueur du tablea via fonction length () :

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

Comme mentionné dans la documentation , vous pouvez également écrire:

{% 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 %}

Il gère à la fois le cas où texts n'est pas défini et le cas où texts est vide.

6
Mathieu Bridon

Il est possible que texts puisse être défini mais contenir un seul élément de liste qui est une chaîne vide; Par exemple:

texts = ['']

Dans ce cas, tester si texts est défini produira un vrai résultat, vous devriez donc tester le premier élément à la place:

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

Vous pouvez également combiner cela avec le |length filtre pour vous assurer qu'il n'a qu'un seul élément.

2
foobrew

C'est une solution soignée et simple qui a bien fonctionné pour moi!

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