2011-07-09 30 views
27

Soy bastante nuevo en Django, pero tienen muchos años de experiencia de codificación en el mundo Java, así que me siento ridícula hacer esta pregunta - Estoy seguro de que la respuesta es obvia y Solo me lo estoy perdiendo. Parece que no puedo encontrar la manera correcta de consultar esto en google o algo así ... He buscado a través de los documentos de django y no está allí o simplemente no lo estoy viendo. Todo lo que quiero hacer es una prueba de plantilla si la var no es nula O una cadena vacía O simplemente un montón de espacios. Tengo un problema donde los espacios se están introduciendo en mi campo; otro problema que tengo que resolver, y lo haré ... pero, quiero que mi lógica funcione independientemente. En este momento, porque mi cadena contiene solo espacios simplemente haciendo esto: {% if lesson.assignment%} siempre pasa aunque yo no quiera. He buscado una funcionalidad de tipo de ajuste que funcionaría entre {%%}, pero parece que no puedo encontrar nada. He intentado quitar, pero no funciona entre {%%}. ¿Puede alguien señalarme en la dirección de la respuesta ... algunos documentos que podría haber perdido ... algo?plantillas de Django Python y prueba si una variable es una cadena nula o vacía

Gracias por tonelada de antemano!

Respuesta

44
{% if lesson.assignment and lesson.assignment.strip %} 

Los .strip llamadas str.strip() para que pueda manejar por espacios en blanco sólo cadenas como vacíos, mientras que la comprobación anterior se asegura de que eliminar a None primero (que no tendría el método .strip())

prueba de que funciona (en ./manage.py shell):

>>> import django 
>>> from django.template import Template, Context 
>>> t = Template("{% if x and x.strip %}OK{% else %}Empty{% endif %}") 
>>> t.render(Context({"x": "ola"})) 
u'OK' 
>>> t.render(Context({"x": " "})) 
u'Empty' 
>>> t.render(Context({"x": ""})) 
u'Empty' 
>>> t.render(Context({"x": None})) 
u'Empty' 
+0

@ PaulP1975: Es posible que se haya perdido porque el uso de 'y' en un' si' es una adición reciente a Django. –

1

Se puede simular mediante el uso de la cut filter para eliminar todos los espacios. Pero probablemente deberías averiguar por qué contiene todos los espacios en primer lugar.

+0

Sí, tengo la intención de solucionar ese hecho de que tiene todos los espacios. Sin embargo, quería que funcionara de cualquier manera y no podía hacer funcionar la función de tira (el código de Shawn anterior funcionó). – PaulP1975

0

puede llamar a cualquier métodos incorporados en cualquier lugar de una variable de plantillas de Django. Por ejemplo, puede llamar al método de cadena de Python strip. Así que esto va a funcionar:

{% if lesson.assignment.strip %} 
+0

Problema: su 'CharField' permite valores NULL, por lo que un campo NULL causará una excepción ya que' None' no tiene un método 'strip'. –

+0

No sé por qué, pero la primera vez que traté de hacerlo no funcionó ... Pude haber alcanzado la condición excepcional (nula) ... No lo recuerdo. – PaulP1975

5

Si lesson.assignment es un campo modelo, se podría definir una función de ayuda en su modelo y usarlo:

class Lesson(models.Model): 
    assignment = models.CharField(..., null=True, ...) 
    # ... 

    @property 
    def has_assignment(self): 
     return self.assignment is not None and self.assignment.strip() != "" 

A continuación, utilice {% if lesson.has_assignment %} en su plantilla.

+0

Esta es una opción interesante ... Me gusta mucho cómo se limpia la lógica en la plantilla. Soy muy nuevo en python y django, así que todavía estoy aprendiendo las cuerdas. ¡Gracias por esta sugerencia! – PaulP1975

5

Esto puede no haber estado disponible cuando la pregunta fue publicada, pero una opción podría ser utilizar el construido en el filtro de plantilla default_if_none (Django Documentation Link).

Por ejemplo: {{ lesson.assignment|default_if_none:"Empty" }}

Cuestiones relacionadas