Modèles Django: Si faux?
Comment puis-je vérifier si une variable est Faux à l'aide de Django la syntaxe du modèle?
{% if myvar == False %}
Ne semble pas fonctionner.
Noter que j'ai très précisément voulez vérifier si elle a le Python valeur False
. Cette variable pourrait être un tableau vide, ce qui est pas ce que je veux vérifier.
- Avoir une variable dans le modèle de contexte qui peuvent être à la fois une liste ainsi qu'un booléen qui semble être la bonne approche en premier lieu?
- Je ne me souviens pas de mon cas d'utilisation. Vous avez peut-être raison.
{% if not myvar%}
il fonctionne dans Django 1.11 pour sûr, je ne suis pas loin vers l'arrière, vous pouvez aller, si!- Assez sûr
not myvar
vérifie si myvar est falsey, pasFalse
. voir aussi - donc, si
myvar
était un booléen,not myvar
sera de retourTrue
si elle a été envoyée pour le modèle comme une variable de contexte par la fonction rendu quelle que soit sa valeur (true ou false)? dans ce cas, il faut vérifier 2 choses: 1-myvar
a été fournie à la fonction rendu, le 2-quelle est la valeurmyvar
a si fourni. Ce sera assez compliqué beaucoup simyvar
est plus d'une classe instace, dictionnaire, objet, etc, plutôt que d'un classique de la variable.
Vous devez vous connecter pour publier un commentaire.
Django 1.10 (notes de version) ajouté le
is
etis not
des opérateurs de comparaison pour lesif
tag. Cette modification fait en sorte que l'identité des tests dans un modèle assez simple.Si Vous utilisez une ancienne version de Django puis à partir de la version 1.5 (notes de version) le moteur de template interprète
True
,False
etNone
correspondante des objets Python.Bien qu'il ne fonctionne pas comme on pourrait s'y attendre.
Pour la postérité, j'ai un peu de
NullBooleanField
s et voici ce que je fais:Pour vérifier si il est
True
:Pour vérifier si il est
False
(remarque cela fonctionne parce qu'il y a seulement 3 valeurs, Vrai/Faux/Aucune):Pour vérifier si il est
None
:Je ne sais pas pourquoi, mais je ne peux pas faire
variable == False
, mais je peux fairevariable == None
.is
ouis not
, jamais les opérateurs d'égalité) pour vérifierNone
s est à l'aide deis
, comme Aucun n'est un singletonmodels.NullBooleanField()
Vous pourriez écrire un modèle personnalisé filtre pour ce faire, dans une demi-douzaine de lignes de code:
Puis dans votre modèle:
Bien sûr, vous pourriez faire de cette balise de modèle beaucoup plus générique... mais cela convient à vos besoins spécifiquement 😉
ifs
. Cool 🙂 j'ai effectivement côté mis la question à l'aide de "None" comme ma valeur false à la place..mais bon à savoir pour référence future.Je pense que cela fonctionnera pour vous:
False
valeurs et pas être déclenchée par des tableaux vides. Cela s'applique à la fois.Dans l'ancienne version, vous pouvez uniquement utiliser la ifequal ou ifnotequal
Exemple:
Comme dans le cas de la balise, un {% else %} clause est facultative.
Les arguments peuvent être des chaînes codées en dur, de sorte que le suivant est valide:
{% ifequal de l'utilisateur.nom d'utilisateur "adrian" %}
...
{% endifequal %}
Une alternative à la ifequal balise est à utiliser si l'étiquette et l'opérateur==.
ifnotequal
Tout comme ifequal, à l'exception des tests que les deux arguments ne sont pas égaux.
Une alternative à la ifnotequal balise est à utiliser si l'étiquette et le != de l'opérateur.
Cependant, maintenant, nous pouvons utiliser des if/else facilement
Des expressions complexes
Tous les ci-dessus peuvent être combinés 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 - qui est, les règles de priorité. La priorité des opérateurs, de la plus basse à la plus élevée, est comme suit:
Plus en détail
https://docs.djangoproject.com/en/dev/ref/templates/builtins/
False
un mot clé pris en charge maintenant?Viens de tomber sur ce nouveau (certains que j'ai eu avant et est venu avec une solution satisfaisante).
Pour un tri-état booléen sémantique (par exemple, à l'aide de
models.NullBooleanField
), cela fonctionne bien:Ou si vous préférez de s'exciter sur l'ensemble de la chose...
De toute façon, elle traite de la condition spéciale où vous n'avez pas de soins sur le
None
(évaluation à la valeur False dans le cas de bloc) ouTrue
cas.J'ai eu ce problème avant, que j'ai résolu par des instructions if imbriquées vérifier d'abord pour aucun type séparément.
Si vous ne souhaitez tester si sa fausse, alors il suffit
EDIT: Cela semble fonctionner.
Maintenant de longueur nulle tableaux sont reconnus comme tels; Aucun des types comme Aucun des types; falses Fausse; Trues comme trues, les cordes/tableaux ci-dessus de longueur 0 comme vrai.
Vous pouvez aussi inclure dans le Contexte d'une variable false_list = [False] et puis ne
None
etFalse
mais pas[]
qui est aussi faux.[]
? Il ne reconnaît pasFalse
. Assez triste que j'aurais à écrire mon propre modèle d'étiquette pour cela :\Regarder la ouinon helper
Par exemple:
Je viens de trouver la suite de ce qui est bon à la recherche dans Django 1.8
Essayer ceci à la place de la valeur n'est pas Faux:
Essayer ceci à la place de la valeur est True:
sauf si vous avez été vraiment jouer avec repr méthodes pour rendre la valeur de ressembler à un booléen je pense que cela devrait vous donner une assez ferme assurance que la valeur est True ou False.
Cela est beaucoup plus facile à vérifier en Python (c'est à dire votre code de vue) que dans le modèle, parce que le code Python est tout simplement:
Illustrant:
Le problème au niveau du modèle est que le modèle
if
ne pas analyseris
(bien qu'il ne parsein
). Aussi, si vous n'avez pas l'esprit, vous pourriez essayer de patch de soutien pouris
dans le moteur de template; base sur le code de==
.== False
devrait fonctionner tout aussi bien. Nous n'avons pas besoinis
, nous avons juste besoin de reconnaîtreFalse
en tant que mot clé. Je suppose qu'il serait plus facile de faire cela dans la vue comme vous l'avez suggéré, mais... c'est ennuyeux d'avoir tous cette booléens qui encombrent la place.myvar is False
est contre la PEP-8; la bonne façon estnot myvar
0 is False
est Faux,0 == False
est Vrai - de sorte que dès que vous ne connaissez pas votre var est un bool,is
est (no pun intended) probablement pas ce que vous voulez.is
être la solution la plus simple qui résout le problème.