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?
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 %}
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 %}
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 %}
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.
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.
C'est une solution soignée et simple qui a bien fonctionné pour moi!
{% if texts is defined and texts[0] is defined %}
...
{% endif %}