Qual è l'equivalente di "nessuno" nei modelli django?


102

Voglio vedere se un campo / variabile non è presente in un modello Django. Qual è la sintassi corretta per questo?

Questo è quello che ho attualmente:

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

Nell'esempio sopra, cosa dovrei usare per sostituire "null"?

Risposte:


132

None, False and Truesono tutti disponibili all'interno di tag e filtri del modello. None, False, la stringa vuota ( '', "", """""") e le liste / tuple vuote vengono valutate tutte Falsequando valutate da if, quindi puoi farlo facilmente

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

Un suggerimento: @fabiocerqueira ha ragione, lascia la logica ai modelli, limita i modelli ad essere l'unico livello di presentazione e calcola cose del genere nel tuo modello. Un esempio:

# 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 }}

Spero che questo ti aiuti :)


Ho appena provato a passare Nessuno come parametro al tag {% cache%} e ho scoperto che non è disponibile. Impegnato a lavorare intorno a questo.
tobych

7
{% if profile.user.first_name is None %}causa un errore di sintassi nel modello Django.
Rockallite

1
Il tuo suggerimento mescola presentazione e logica inserendo HTML nel tuo modello, facendo esattamente l'opposto di ciò che stai cercando di insegnare. Che ne dici di restituire Nessuno se non c'è un nome (comportamento logico per un modello di dati) e quindi utilizzare il default_if_nonefiltro nel modello?
jbg

@ JasperBryant-Greene hai ragione! appena aggiornato. Buon pescatore! Grazie!
Gerard

67

Puoi anche utilizzare un altro modello integrato default_if_none

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

1
Qualche idea su come usarlo con altri filtri come la data? Ad esempio, è possibile visualizzare "N / A" se una data non è presente, ma altrimenti formattarla? Come: {{post.pub_date | default_if_none: "N / A" | date: "Ymd"}}?
Andreas Bergström

@ AndreasBergström Nel tuo caso ti candidi per dateprimo. Se si verifica un errore, restituirà Nessuno. Quindi si applica default_if_none.
Defance

Quale versione di Django è stata introdotta?
Utente

10

isoperatore: nuovo in Django 1.10

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

5

Guarda l' aiutante yesno

Per esempio:

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

4

{% if profile.user.first_name %}funziona (supponendo che anche tu non voglia accettare '').

ifin Python in ossequi generali None, False, '', [], {}, ... tutto come false.



0

Potresti provare questo:

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

In questo modo, stai essenzialmente controllando se il campo del modulo first_nameha un valore associato ad esso. Vedere {{ field.value }}in Ciclo sui campi del modulo nella documentazione di Django .

Sto usando Django 3.0.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.