Quel est l'équivalent de «aucun» dans les modèles django?

103

Je veux voir si un champ / une variable n'est aucun dans un modèle Django. Quelle est la syntaxe correcte pour cela?

Voici ce que j'ai actuellement:

{% if profile.user.first_name is null %}
  <p> -- </p>
{% elif %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif%}

Dans l'exemple ci-dessus, que dois-je utiliser pour remplacer "null"?

goelv
la source

Réponses:

134

None, False and Truetous sont disponibles dans les balises de modèle et les filtres. None, False, la chaîne vide ( '', "", """""") et les listes / tuples vides sont toutes évaluées Falselorsqu'elles sont évaluées par if, donc vous pouvez facilement le faire

{% if profile.user.first_name == None %}
{% if not profile.user.first_name %}

Un indice: @fabiocerqueira a raison, laissez la logique aux modèles, limitez les modèles à la seule couche de présentation et calculez des trucs comme ça dans votre modèle. Un exemple:

# someapp/models.py
class UserProfile(models.Model):
    user = models.OneToOneField('auth.User')
    # other fields

    def get_full_name(self):
        if not self.user.first_name:
            return
        return ' '.join([self.user.first_name, self.user.last_name])

# template
{{ user.get_profile.get_full_name }}

J'espère que cela t'aides :)

Gérard
la source
J'ai juste essayé de passer None comme paramètre à la balise {% cache%} et j'ai appris qu'il n'était pas disponible. Occupé à travailler autour de cela.
tobych
7
{% if profile.user.first_name is None %}provoque une erreur de syntaxe dans le modèle Django.
Rockallite
1
Votre indice mêle présentation et logique en insérant du HTML dans votre modèle, en faisant exactement le contraire de ce que vous essayez d'enseigner. Que diriez-vous de renvoyer None s'il n'y a pas de nom (comportement logique pour un modèle de données) puis d'utiliser le default_if_nonefiltre dans le modèle?
jbg
@ JasperBryant-Greene vous avez raison! juste mis à jour. Bon homme de capture! THX!
Gerard
67

Vous pouvez également utiliser un autre modèle intégré default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
la source
1
Une idée comment l'utiliser avec d'autres filtres tels que la date? Par exemple, est-il possible d'afficher "N / A" si une date n'est aucune mais autrement la formater? Comme: {{post.pub_date | default_if_none: "N / A" | date: "Ymd"}}?
Andreas Bergström
@ AndreasBergström Dans votre cas, vous postulez en datepremier. Si une erreur se produit, elle renverra None. Ensuite, vous postulez default_if_none.
défance le
Quelle version de Django a-t-il été introduit?
Utilisateur le
10

isopérateur: Nouveau dans Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
user6763622
la source
5

Regardez l' assistant yesno

Par exemple:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
mwjackson
la source
4

{% if profile.user.first_name %}fonctionne (en supposant que vous ne vouliez pas non plus accepter '').

ifen Python en général traite None, False, '', [], {}, ... tout aussi faux.

DJ
la source
3

Vous pouvez également utiliser le filtre de modèle intégré default:

Si la valeur est évaluée à False (par exemple None, une chaîne vide, 0, False); le "-" par défaut est affiché.

{{ profile.user.first_name|default:"--" }}

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

Louis
la source
1
default_if_none serait probablement une meilleure option.
dbn le
0

Vous pouvez essayer ceci:

{% if not profile.user.first_name.value %}
  <p> -- </p>
{% else %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif %}

De cette façon, vous vérifiez essentiellement si le champ de formulaire first_namea une valeur qui lui est associée. Voir {{ field.value }}en boucle sur les champs du formulaire dans la documentation Django .

J'utilise Django 3.0.

claypooj
la source