¿Cuál es el equivalente de "ninguno" en las plantillas de django?

102

Quiero ver si un campo / variable no es ninguno dentro de una plantilla de Django. ¿Cuál es la sintaxis correcta para eso?

Esto es lo que tengo actualmente:

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

En el ejemplo anterior, ¿qué usaría para reemplazar "nulo"?

goelv
fuente

Respuestas:

132

None, False and Truetodos están disponibles en etiquetas de plantilla y filtros. None, False, la cadena vacía ( '', "", """""") y las listas / tuplas vacías se evalúan Falsecuando son evaluadas por if, por lo que puede hacer fácilmente

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

Una pista: @fabiocerqueira tiene razón, deja la lógica a los modelos, limita las plantillas para que sean la única capa de presentación y calcula cosas así en tu modelo. Un ejemplo:

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

Espero que esto ayude :)

Gerard
fuente
Intenté pasar None como parámetro a la etiqueta {% cache%} y descubrí que no está disponible. Ocupado trabajando en esto.
tobych
7
{% if profile.user.first_name is None %}provoca un error de sintaxis en la plantilla de Django.
Rockallite
1
Su sugerencia mezcla la presentación y la lógica al poner HTML en su modelo, haciendo exactamente lo contrario de lo que está tratando de enseñar. ¿Qué tal devolver Ninguno si no hay un nombre (comportamiento lógico para un modelo de datos) y luego usar el default_if_nonefiltro en la plantilla?
jbg
@ JasperBryant-Greene, ¡tienes razón! recién actualizado. ¡Buen partido, hombre! ¡Gracias!
Gerard
67

También puede utilizar otra plantilla incorporada default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
fuente
1
¿Alguna idea de cómo usar esto con otros filtros como la fecha? Por ejemplo, ¿es posible mostrar "N / A" si una fecha no es ninguna pero de lo contrario formatee? Me gusta: {{post.pub_date | default_if_none: "N / A" | fecha: "Ymd"}}?
Andreas Bergström
@ AndreasBergström En su caso, solicite dateprimero. Si ocurre algún error, devolverá Ninguno. Entonces aplica default_if_none.
defance el
¿Qué versión de Django se trajo?
Usuario
10

isoperador: Nuevo en Django 1.10

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

Mira el ayudante de yesno

P.ej:

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

{% if profile.user.first_name %}funciona (suponiendo que tampoco quieras aceptar '').

ifen Python en golosinas generales None, False, '', [], {}, ... todo como falso.

Dougal
fuente
3

También puede utilizar el filtro de plantilla integrado default:

Si el valor se evalúa como Falso (por ejemplo, Ninguno, una cadena vacía, 0, Falso); se muestra el "-" predeterminado.

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

Documentación: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

Luis
fuente
1
default_if_none probablemente sería una mejor opción.
dbn
0

Puedes probar esto:

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

De esta manera, esencialmente está verificando si el campo del formulario first_nametiene algún valor asociado. Ver {{ field.value }}en Bucle sobre los campos del formulario en la Documentación de Django .

Estoy usando Django 3.0.

Claypooj
fuente