web-dev-qa-db-fra.com

Supprimer la sortie "None" en tant que chaîne dans Jinja2

Comment puis-je persuader Jinja2 de ne pas imprimer "None" lorsque la valeur est None?

J'ai un certain nombre d'entrées dans un dictionnaire et je voudrais tout afficher en une seule boucle au lieu d'avoir des cas spéciaux pour différents mots clés. Si j'ai une valeur de None (le NoneType pas la chaîne) alors la chaîne "None" est inséré dans les résultats de rendu du modèle.

Essayer de le supprimer à l'aide de {{ value or '' }} fonctionne trop bien car il remplacera également la valeur numérique zéro.

Dois-je filtrer le dictionnaire avant de le passer à Jinja2 pour le rendu?

49
Spaceghost

Dans les nouvelles versions de Jinja2 (2.9+):

{{ value if value }}

Dans les anciennes versions de Jinja2 (antérieures à 2.9):

{{ value if value is not none }} fonctionne très bien.

si cela soulève une erreur de ne pas avoir d'autre, essayez d'utiliser un autre ..

{{ value if value is not none else '' }}

45
Joran Beasley

Une autre option consiste à utiliser le hook finalize sur l'environnement:

>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'

mais:

>>> def my_finalize(thing):
...     return thing if thing is not None else ''
...
>>> e = jinja2.Environment(finalize=my_finalize)
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / '
28

filtre par défaut :

{{ value|default("", True) }}
22
solarc

Selon cet article de la liste de diffusion Pocco: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher (créateur de Jinja2/Flask, etc ...) recommande l'extrait "Pythonic" suivant:

{{ variable or 0 }}{{ variable or '' }}

L'idée étant qu'encore une fois, l'explicite est préférable à l'implicite.

Modifier: la réponse sélectionnée est certainement la bonne. Je n'ai pas vraiment rencontré de situation où une variable de modèle serait soit une chaîne soit le zéro numérique, donc les extraits ci-dessus pourraient aider à réduire le bruit de code dans le modèle.

18
Brownbay

Un filtre personnalisé peut résoudre le problème. Déclarez-le comme ceci:

def filter_supress_none(val):
    if not val is None:
        return val
    else:
        return ''

Installez-le comme ceci:

templating_environment.filters['sn'] = filter_supress_none

Utilisez-le comme ceci:

{{value|sn}}
14
AlexVhr