web-dev-qa-db-fra.com

Comment puis-je rompre une boucle for dans jinja2?

Comment puis-je sortir d'une boucle for dans jinja2?

mon code est comme ceci:

<a href="#">
{% for page in pages if page.tags['foo'] == bar %}
{{page.title}}
{% break %}
{% endfor %}
</a>

J'ai plusieurs pages qui ont cette condition et je veux mettre fin à la boucle, une fois que la condition est remplie.

30
Taxellool

Vous ne pouvez pas utiliser break, vous préférez filtrer. Depuis le Jinja2 documentation sur {% for %} :

Contrairement à Python il n'est pas possible d'interrompre ou de continuer dans une boucle. Vous pouvez cependant filtrer la séquence pendant l'itération qui vous permet de sauter des éléments. L'exemple suivant ignore tous les utilisateurs qui sont cachés:

{% for user in users if not user.hidden %}
    <li>{{ user.username|e }}</li>
{% endfor %}

Dans votre cas, cependant, vous ne semblez avoir besoin que du premier élément ; il suffit de filtrer et de choisir le premier:

{{ (pages|selectattr('tags.foo', bar)|first).title }}

Ceci filtre la liste en utilisant le filtre selectattr() , dont le résultat est passé au filtre first .

Le filtre selectattr() produit un itérateur, donc l'utilisation de first ici ne fera qu'itérer sur l'entrée jusqu'au premier élément correspondant, et pas plus.

42
Martijn Pieters

Break et Continue peuvent être ajoutés à Jinja2 en utilisant l'extension des commandes de boucle. Jinja Loop Control Ajoutez simplement l'extension à l'environnement jinja.

jinja_env = Environment(extensions=['jinja2.ext.loopcontrols'])

selon sb32134 commentaire

10
oneklc

Mais si pour une raison quelconque vous avez besoin d'une boucle, vous pouvez vérifier l'index de boucle à l'intérieur du bloc for-loop en utilisant "loop.first":

{% for dict in list_of_dict %} 
    {% for key, value in dict.items() if loop.first %}
      <th>{{ key }}</th>
    {% endfor %} 
{% endfor %}
6
Nikolay Bystritskiy