2009-09-17 17 views
6

He un modelo como este con Django 1.1:¿El modelo.CharField ('blank = False') funciona con save()?

class Booking(models.Model): 
    name = models.CharField(max_length=100) 

Por defecto, estoy leyendo que tanto 'nula' y 'blanco' son falsas.

Así, con una prueba como esta ...

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.save() 

... Me espera el salve a lanzar una excepción. Pero no es así Parece bastante feliz crear un nuevo registro con un nombre en blanco (Postgres y SQLite3).

Observo que a través de la interfaz de administración, un guardado falla con un "este campo es obligatorio".

Las preguntas son:

  1. es el 'blanco' atributo de sólo aplicada por las formas?
  2. ¿Es la solución para anular el método save() y comprobar explícitamente que len (name)! = 0?
  3. ¿He entendido mal algo que una vez entendido resuelve mi malentendido?
+0

La respuesta al título es "No". Parece que es una práctica común asumir datos válidos en el modelo y confiar la validación al formulario. –

+0

http://stackoverflow.com/questions/6940499/how-can-you-create-a-non-empty-charfield-in-django –

Respuesta

5

ACTUALIZACIÓN: Ver el model validation documentation en los últimos versiones de Django.

Original answer: blank=True/False only applies to forms. La validación de datos actualmente solo ocurre en el nivel del formulario; esto cambiará cuando el model-validation Google Summer of Code work se fusione en el enlace troncal.

El único tipo de validación que ocurre actualmente en la capa del modelo es cualquier error que arroje el servidor de la base de datos si no puede manejar lo que obtiene. En el caso de un CharField vacío, generalmente nunca obtendrá errores de la base de datos, ya que Django establece el campo en una cadena vacía de manera predeterminada.

Por ahora, debe usar el método save() para cualquier validación a nivel de modelo que desee. Pronto (si está en el maletero) o cuando sale 1.2, use las cosas de validación del modelo.

+1

Parece una respuesta antigua, pero la pregunta parece ser relevante. ¿Qué terminó aquí? – Lucretiel

+0

Un hilo más reciente: https://stackoverflow.com/questions/17816229 – texnic

1

Desde el Django Docs:

"Tenga en cuenta que los valores de cadena vacías siempre se almacenan como cadenas vacías, no como NULL Sólo utilizar null = True para campos que no son cadenas, como enteros, booleanos y fechas.. "

Su código está almacenando una cadena vacía.

Para ilustrar esto, trate de:

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.name = None 
     b.save() 
+0

Es cierto, pero no responde la pregunta. –

+3

Sí, de hecho está almacenando una cadena vacía. Ese es el problema. Como 'en blanco' está configurado como 'Falso' esperaba que lo evitara. –

Cuestiones relacionadas