2012-06-21 7 views
41

¿Cómo convenzo a Jinja2 para que no imprima "None" cuando el valor es None?Suprime la salida "Ninguno" como una cadena en Jinja2

Tengo un número de entradas en un diccionario y me gustaría dar salida a todo en un solo bucle en lugar de tener casos especiales para diferentes palabras clave. Si tengo un valor de None (el NoneType no la cadena), la cadena "None" se inserta en los resultados de la representación de la plantilla.

Intentar suprimir utilizando {{ value or '' }} funciona demasiado bien, ya que también reemplazará el valor numérico cero.

¿Necesito filtrar el diccionario antes de pasarlo a Jinja2 para la representación?

+1

¿Hay alguna forma de hacerlo sin interferir con la plantilla? – lajarre

Respuesta

37

{{ value if value is not None }} funciona muy bien.

si esto genera un error de no tener una persona intente utilizar un else ..

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

+1

Recibí un error con esto: 'UndefinedError: la if-expression en línea evaluada como falsa y no se definió ninguna otra sección. –

+4

' {{value if value! = None else ''}} 'puede ser necesario para evitar el problema @GeenHenk tenía – robo

+2

Creo que 'no es None' en lugar de'! = None' debe ser usado. – warvariuc

20

Default filter:

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

esto tiene el mismo problema que la solución principal de OP ... Creo que esto funcionaría como {{value | default ("", ** True **)}} –

+0

Sin True, esto no funciona en absoluto. Con el True, reemplaza None y el cero numérico ... así que no sirve. – Spaceghost

+0

Tiene razón, solo funciona cuando la variable no está definida en lugar de asignarle None. Pero escribir un filtro para el caso None valdría la pena solo por ser menos detallado que la respuesta elegida. – solarc

24

Otra opción es utilizar el gancho finalize sobre el medio ambiente:

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

pero:

>>> 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

Un filtro personalizado puede resolver el problema. Declarar así:

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

instalarlo como esto:

templating_environment.filters['sn'] = filter_supress_none 

utilizar de esta manera:

{{value|sn}} 
+2

Posiblemente la solución más elegante aquí. Jinja podría tener un filtro como este, tal vez con un nombre menos críptico que "sn" :) –

+2

Gran respuesta. Un nitpick: 'if val is not None' sería más legible. – MarredCheese

17

De acuerdo con esta entrada de la lista de correo Pocco: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher (creador de Jinja2/Flask, etc.) recomienda el siguiente "pitónico" fragmento:

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

La idea aquí es que, una vez más, es preferible explícita implícita.

Editar: La respuesta seleccionada es definitivamente la correcta. Realmente no he encontrado una situación en la que una variable de plantilla sea una cadena o el cero numérico, por lo que los fragmentos anteriores pueden ayudar a reducir el ruido del código en la plantilla.

+0

Se señaló en la pregunta que esto no ayuda porque también suprime el cero numérico – Spaceghost

Cuestiones relacionadas