Modèles Django: Si faux?

Comment vérifier si une variable est False en utilisant la syntaxe du modèle Django?

{% if myvar == False %} 

Cela ne semble pas fonctionner.

Notez que je veux vérifier très spécifiquement si la valeur de Python est False . Cette variable pourrait aussi être un tableau vide, ce qui n’est pas ce que je veux vérifier.

Django 1.10 (notes de version) a ajouté les opérateurs de comparaison is et is not à la balise if . Ce changement rend les tests d’identité dans un modèle assez simple.

 In[2]: from django.template import Context, Template In[3]: context = Context({"somevar": False, "zero": 0}) In[4]: compare_false = Template("{% if somevar is False %}is false{% endif %}") In[5]: compare_false.render(context) Out[5]: u'is false' In[6]: compare_zero = Template("{% if zero is not False %}not false{% endif %}") In[7]: compare_zero.render(context) Out[7]: u'not false' 

Si vous utilisez un ancien Django, à partir de la version 1.5 (notes de version), le moteur de modèle interprète True , False et None comme les objects Python correspondants.

 In[2]: from django.template import Context, Template In[3]: context = Context({"is_true": True, "is_false": False, "is_none": None, "zero": 0}) In[4]: compare_true = Template("{% if is_true == True %}true{% endif %}") In[5]: compare_true.render(context) Out[5]: u'true' In[6]: compare_false = Template("{% if is_false == False %}false{% endif %}") In[7]: compare_false.render(context) Out[7]: u'false' In[8]: compare_none = Template("{% if is_none == None %}none{% endif %}") In[9]: compare_none.render(context) Out[9]: u'none' 

Bien que cela ne fonctionne pas comme on pourrait s’y attendre.

 In[10]: compare_zero = Template("{% if zero == False %}0 == False{% endif %}") In[11]: compare_zero.render(context) Out[11]: u'0 == False' 

Pour la postérité, j’ai quelques NullBooleanField et voici ce que je fais:

Pour vérifier si c’est True :

 {% if variable %}True{% endif %} 

Pour vérifier si c’est False (notez que cela fonctionne car il n’y a que 3 valeurs – True / False / None):

 {% if variable != None %}False{% endif %} 

Pour vérifier s’il n’y en a None :

 {% if variable == None %}None{% endif %} 

Je ne sais pas pourquoi, mais je ne peux pas faire de variable == False , mais je peux faire des variable == None .

Vous pouvez écrire un filtre de modèle personnalisé pour le faire dans une demi-douzaine de lignes de code:

 from django.template import Library register = Library() @register.filter def is_false(arg): return arg is False 

Ensuite, dans votre modèle:

 {% if myvar|is_false %}...{% endif %} 

Bien sûr, vous pourriez rendre ce tag beaucoup plus générique … mais cela répond spécifiquement à vos besoins 😉

Je pense que cela fonctionnera pour vous:

 {% if not myvar %} 

Dans l’ancienne version, vous ne pouvez utiliser que les ifequal ou ifnotequal

 {% ifequal YourVariable ExpectValue %} # Do something here. {% endifequal %} 

Exemple:

 {% ifequal userid 1 %} Hello No.1 {% endifequal %} {% ifnotequal username 'django' %} You are not django! {% else %} Hi django! {% endifnotequal %} 

Comme dans la balise if, une clause {% else%} est facultative.

Les arguments peuvent être des chaînes codées en dur, les éléments suivants sont donc valides:

{% ifequal user.username “adrian”%} … {% endifequal%} Une alternative à la balise ifequal consiste à utiliser la balise if et l’opérateur ==.

ifnotequal Tout comme ifequal, sauf qu’il teste que les deux arguments ne sont pas égaux.

Une alternative à la balise ifnotequal est d’utiliser la balise if et l’opérateur! =.

Cependant, nous pouvons maintenant utiliser si / autrement facilement

 {% if somevar >= 1 %} {% endif %} {% if "bc" in "abcdef" %} This appears since "bc" is a subssortingng of "abcdef" {% endif %} 

Expressions complexes

Tout ce qui précède peut être combiné pour former des expressions complexes. Pour de telles expressions, il peut être important de savoir comment les opérateurs sont regroupés lors de l’évaluation de l’expression, c’est-à-dire les règles de priorité. La priorité des opérateurs, du plus bas au plus élevé, est la suivante:

  • ou
  • et
  • ne pas
  • dans
  • ==,! =, <,>, <=,> =

Plus de détails

https://docs.djangoproject.com/en/dev/ref/templates/builtins/

Je viens juste de le rencontrer (certain que je l’avais avant et que j’ai trouvé une solution moins satisfaisante).

Pour une sémantique booléenne à trois états (par exemple, en utilisant models.NullBooleanField ), cela fonctionne bien:

 {% if test.passed|lower == 'false' %} ... {% endif %} 

Ou si vous préférez vous passionner pour le tout …

 {% if test.passed|upper == 'FALSE' %} ... {% endif %} 

Dans tous les cas, cela gère la condition spéciale dans laquelle vous ne vous souciez pas du cas None (en évaluant à False dans le bloc if) ou True .

J’ai déjà eu ce problème, que j’ai résolu en imbriquant les instructions if en vérifiant d’abord aucun type séparément.

 {% if object.some_bool == None %}Empty {% else %}{% if not object.some_bool %}False{% else %}True{% endif %}{% endif %} 

Si vous voulez seulement tester si c’est faux, alors juste

 {% if some_bool == None %}{% else %}{% if not some_bool %}False{% endif %}{% endif %} 

EDIT: Cela semble fonctionner.

 {% if 0 == a|length %}Zero-length array{% else %}{% if a == None %}None type{% else %}{% if not a %}False type{% else %}True-type {% endif %}{% endif %}{% endif %} 

Maintenant, les tableaux de longueur zéro sont reconnus comme tels; Aucun type en tant que type None; falses comme faux; Des trues comme des trues; les chaînes / tableaux au-dessus de la longueur 0 sont vrais.

Vous pouvez également inclure dans le contexte une variable false_list = [False,] et ensuite faire

 {% if some_bool in false_list %}False {% endif %} 

Regardez l’aide de yesno

Par exemple:

 {{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }} 

Il est beaucoup plus facile de vérifier Python (c.-à-d. Votre code de vue) que dans le modèle, car le code Python est simplement:

 myvar is False 

Illustrant:

 >>> False is False True >>> None is False False >>> [] is False False 

Le problème au niveau du template est que le template if n’est pas analysé (même s’il est analysé). De plus, si cela ne vous dérange pas, vous pouvez essayer de patcher le support car is dans le moteur de template; basez-le sur le code pour == .

Je viens juste de proposer les éléments suivants qui semblent bons dans Django 1.8

Essayez ceci au lieu de la valeur n’est pas faux:

 if value|ssortingngformat:'r' != 'False' 

Essayez ceci au lieu de la valeur True:

 if value|ssortingngformat:'r' == 'True' 

À moins que vous n’ayez vraiment joué avec les méthodes repr pour faire en sorte que la valeur ressemble à un booléen, je pense que cela devrait vous donner une assurance suffisamment ferme pour que la valeur soit True ou False.