web-dev-qa-db-fra.com

Test d'une liste dans Jinja2

Pour autant que je sache, il n'ya aucun moyen de tester si un objet est une instance de liste à Jinja2. Premièrement, est-ce correct et deuxièmement, quelqu'un a-t-il mis en œuvre un test/extension personnalisé à Jinja2? Toute aide est la bienvenue.

23
MFB

Vous pouvez facilement faire cela avec un filtre personnalisé dans Jinja2.

Tout d'abord vous créer méthode d'essai:

def is_list(value):
    return isinstance(value, list)

Et ajoutez-le sous forme de filtre personnalisé:

j = jinja2.Jinja2(app)
j.environment.filters.update({
        'is_list': is_list,
})
15
fredrik

Je l'ai fait comme ça:

{% if var is iterable and var is not string %}
54
insider

Dans ma configuration, j'aimerais que la valeur soit une chaîne ou une liste de chaînes entrant dans le modèle Jinja. Donc, vraiment ce que j'ai soigné, ce n'était pas une liste VS String, mais un élément unique vs plusieurs articles. Cette réponse pourrait aider si votre cas d'utilisation est similaire.

Puisqu'il n'y a pas de test intégré pour "est la liste?" Cela rejette également les chaînes, j'ai emprunté un motif de la conception de l'API et enveloppé les objets uniques dans une liste sur le Python côté puis vérifié la longueur de la liste du côté Jinja.

Python:

context = { ... }

# ex. value = 'a', or ['a', 'b']
if not isinstance(value, list):
    value = [value]

context['foo'] = value

Jinja:

{% if foo|length == 1 %}
  single-item list
{% Elif foo|length > 1 %}
  multi-item list
{% endif %}

Et si tout ce que vous voulez faire est d'ajouter un séparateur d'élément à des fins d'affichage, vous pouvez ignorer la vérification de la longueur explicite et juste {{ value|join(', ') }}.

1
Taylor Edmiston

Jinja a de nombreux tests intégrés. Vous recherchez probablement itérable .

{% if var is iterable %}
0
Zack