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?
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 '' }}
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 / '
{{ value|default("", True) }}
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.
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}}