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.
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,
})
Je l'ai fait comme ça:
{% if var is iterable and var is not string %}
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(', ') }}
.
Jinja a de nombreux tests intégrés. Vous recherchez probablement itérable .
{% if var is iterable %}