2010-07-15 3 views
14

Comment puis-je faire la distinction entre None et False dans les modèles django?Gabarits Django: Faux vs. Aucun

{% if x %} 
True 
{% else %} 
None and False - how can I split this case? 
{% endif %} 

Répondre

12

Chaque contexte de modèle Django contains True, False and None. Pour Django 1.10 et plus tard, vous pouvez effectuer les opérations suivantes:

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

Django 1.9 et versions antérieures ne prennent pas en charge l'opérateur is dans la balise if. La plupart du temps, il est permis d'utiliser {% if x == None %} à la place.

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

Avec Django 1.4 et versions antérieures, vous n'avez pas accès dans le contexte du modèle à True, False et None, vous pouvez utiliser le filtre à la place yesno.

De l'avis:

x = True 
y = False 
z = None 

Dans le modèle:

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

Résultat:

true 
false 
none 
5

Vous pouvez créer un filtre personnalisé:

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

, utilisez-le:

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

Bien sûr, vous pouvez modifier le filtre pour tester quelque condition que vous aimez aussi ...

+1

Ceci est la réponse correcte, mais vous ne devriez pas avoir à faire cela - il devrait être intégré à Django! –

2

Une amélioration des réponses précédentes pourrait être:

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

Joli usage de ce qui est déjà disponible dans le langage template. – Brandon

+1

Je trouve cela déroutant - il n'est pas du tout évident que vous essayez de faire la distinction entre None et False. Même maintenant, je ne comprends pas vraiment comment cela fonctionne. –

+0

@NickPerkins, vous l'obtiendrez une fois que vous saurez que le troisième paramètre du filtre 'yesno' est retourné si' x' est None. –

0

Créer context_processor (ou utiliser à partir du module django-miscmisc.context_processors.useful_constants) avec True, False, None constantes et utiliser {% if x == None %} ou {% if x == False %}

context_processor.py:

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

Voici une autre façon délicate:

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

C'est parce que "None" n'a pas l'attribut "den ominateur ", alors que c'est 1 pour" Vrai "et" Faux ".

Questions connexes