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 %}
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 %}
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
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 ...
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 %}
Joli usage de ce qui est déjà disponible dans le langage template. – Brandon
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. –
@NickPerkins, vous l'obtiendrez une fois que vous saurez que le troisième paramètre du filtre 'yesno' est retourné si' x' est None. –
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}
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 ".
Ceci est la réponse correcte, mais vous ne devriez pas avoir à faire cela - il devrait être intégré à Django! –