2010-07-15 26 views

Respuesta

12

Cada contexto de la plantilla Django contains True, False and None. Para Django 1.10 y posterior, puede hacer lo siguiente:

{% if x %} 
True 
{% elif x is None %} 
None 
{% else %} 
False (or empty string, empty list etc) 
{% endif %} 

Django 1.9 y anteriores no admiten el operador is en la etiqueta if. La mayoría de las veces, está bien usar {% if x == None %} en su lugar.

{% if x %} 
True 
{% elif x == None %} 
None 
{% else %} 
False (or empty string, empty list etc) 
{% endif %} 

Con Django 1.4 y anteriores, usted no tiene acceso a True, False y None en el contexto de la plantilla, puede utilizar el filtro yesno lugar.

En la vista:

x = True 
y = False 
z = None 

En la plantilla:

{{ x|yesno:"true,false,none" }} 
{{ y|yesno:"true,false,none" }}  
{{ z|yesno:"true,false,none" }}  

Resultado:

true 
false 
none 
5

Puede crear un filtro personalizado:

@register.filter 
def is_not_None(val): 
    return val is not None 

y utilizarla:

{% if x|is_not_None %} 
    {% if x %} 
     True 
    {% else %} 
     False 
    {% endif %} 
{% else %} 
    None 
{% endif %} 

Por supuesto, se puede ajustar el filtro para probar cualquier condición que gusta también ...

+1

Esta es la respuesta correcta, pero no debería tener que hacer esto, ¡debería estar incorporado en Django! –

2

Una mejora de las respuestas anteriores podrían ser:

{% if x|yesno:"2,1," %} 
    # will enter here if x is True or False, but not None 
{% else %} 
    # will enter only if x is None 
{% endif %} 
+0

Buen uso de lo que ya está disponible en el lenguaje de plantilla. – Brandon

+1

Encuentro esto confuso, no es del todo obvio que estés tratando de distinguir entre Ninguno y Falso. Incluso ahora no entiendo cómo funciona. –

+0

@NickPerkins, lo obtendrá una vez que sepa que el tercer parámetro en el filtro 'yesno' se devuelve si' x' es None. –

0

Crear context_processor (o usar desde el módulo de django-miscmisc.context_processors.useful_constants) con True, False, None constantes y utilizar {% if x == None %} o {% if x == False %}

context_processor.py:

def useful_constants(request): 
    return {'True': True, 'False': False, 'None': None} 
0

Aquí es otra manera difícil:

{% if not x.denominator %} 
    None 
{% else %} 
    {% if x %} 
     True 
    {% else %} 
     False 
    {% endif %} 
{% endif %} 

Eso es porque "Ninguno" no tiene el atributo "guarida" ominator ", mientras que es 1 para" True "y" False ".