2012-06-21 17 views
41

Wie überrede ich Jinja2 "None" nicht zu drucken, wenn der Wert None ist?Unterdrücken "Keine" Ausgabe als Zeichenfolge in Jinja2

Ich habe eine Reihe von Einträgen in einem Wörterbuch und ich möchte alles in einer einzigen Schleife ausgeben, anstatt Sonderfälle für verschiedene Schlüsselwörter. Wenn ich einen Wert von None habe (der NoneType nicht die Zeichenfolge), wird die Zeichenfolge "None" in die Vorlage Renderergebnisse eingefügt.

Der Versuch, es unter Verwendung {{ value or '' }} zu unterdrücken, funktioniert zu gut, da es auch den numerischen Wert Null ersetzt.

Muss ich das Wörterbuch filtern, bevor es zum Rendern an Jinja2 übergeben wird?

+1

Gibt es eine Möglichkeit, dies ohne Störung der Vorlage zu tun? – lajarre

Antwort

37

{{ value if value is not None }} funktioniert gut.

wenn dies einen Fehler auslöst über kein anderes versuchen, die ein anderes verwenden ..

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

+1

Ich habe einen Fehler damit: 'UndefinedError: der Inline-If-Ausdruck ausgewertet, um falsch und keine anderen Abschnitt wurde definiert. ' –

+4

' {{Wert wenn Wert! = Keine anderen' '}} kann notwendig sein, um das Problem zu vermeiden @GeenHenk hatte – robo

+2

Ich denke "ist nicht keiner" anstelle von "! = Keine" sollte verwendet werden. – warvariuc

20

Default filter:

{{ value|default("", True) }} 
+1

Dies hat das gleiche Problem wie die Hauptlösung von OP ... Ich denke, das würde funktionieren als {{Wert | Standard ("", ** Wahr **)}} –

+0

Ohne True funktioniert das überhaupt nicht. Mit dem Wahr, ersetzt es die None und die numerische Null .. also nicht gut. – Spaceghost

+0

Sie haben Recht, es funktioniert nur, wenn die Variable nicht definiert ist, anstatt ihr keine zuzuweisen. Aber einen Filter für den Fall None zu schreiben wäre es wert, nur weil er weniger ausführlich ist als die gewählte Antwort. – solarc

24

Eine weitere Option ist die finalize Haken auf die Umwelt zu verwenden:

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

aber:

>>> 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/' 
14

Ein kundenspezifischer Filter kann das Problem lösen. Erklären Sie es wie folgt aus:

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

Installieren Sie es wie folgt aus:

templating_environment.filters['sn'] = filter_supress_none 

Verwenden Sie es wie folgt aus:

{{value|sn}} 
+2

Möglicherweise die eleganteste Lösung hier. Jinja könnte einen Filter wie diesen haben, vielleicht mit weniger kryptischen Namen als "sn" :) –

+2

Große Antwort. Ein Nitpick: 'Wenn val ist nicht None' wäre besser lesbar. – MarredCheese

17

Nach diesem Beitrag aus der Pocco Mailing-Liste: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher (Ersteller von Jinja2/Flask, etc ...) empfiehlt folgendes "Python" Snippet:

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

Die hier Vorstellung, dass wieder einmal zu sein, explizit vorzuziehen implizit.

Edit: Die ausgewählte Antwort ist definitiv die richtige. Ich bin nicht wirklich auf eine Situation gestoßen, in der eine Template-Variable entweder eine Zeichenkette oder die numerische Null wäre, sodass die obigen Snippets dazu beitragen könnten, das Code-Rauschen in der Vorlage zu reduzieren.

+0

Es wurde in der Frage festgestellt, dass dies nicht hilft, weil es auch numerische Null unterdrückt – Spaceghost

Verwandte Themen