2011-05-10 11 views
6

soy un novato en el desarrollo django. Estoy creando una clase A, que podría tener múltiples clase B asignado:django 'DateTimeField' no tiene ningún error de valor predeterminado

class A(models.Model):   
    name = models.CharField(max_length=200)  

    def __unicode__(self): 
     self.name 


class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date') 

cuando estoy tratando de crear un nuevo elemento "A" en la página de administración, y la creación de un elemento coincidente B para él y luego save(), me estoy haciendo la advertencia: 'mydate' el campo no tiene un valor por defecto

Si muevo el "mydate", elemento de la clase a, a continuación, al golpear save() que estoy recibiendo un mensaje Este campo es requiere de Django, requiere que complete el campo!

¡¿Cómo puedo hacer que este mensaje requerido aparezca también cuando el campo de fecha es parte de B !!!

Gracias

+0

Es necesario añadir más detalles para una buena respuesta aquí. ¿Cómo está "creando un elemento B correspondiente"? ¿Se hace en el método 'save' de' A', como parte de una señal 'post_save', o estás yendo literalmente a la página de agregar/cambiar admin para' B' y hacerlo desde allí? Dependiendo de qué método, la respuesta a su pregunta podría ser muy diferente. –

+0

sí, estaba tratando de hacer esto a través de un elemento de guardar()! No sé lo que es el post_save, sin embargo supongo que se llama para cada B i save junto con A – sramij

Respuesta

12

Si no se ha especificado, que su campo es opcional, se le tiene que proporcionar un valor para ella cada vez que se crea un objeto. En su caso no se puede por lo que tendrá que hacer una de esas cosas:

Aquí es cómo hacer campo opcional:

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', blank=True, null=True) 

Aquí es cómo se establece el valor por defecto:

import datetime 

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=datetime.datetime.now) 
+0

tuve que moverme a sqlit también para hacerlo funcionar! además de su propuesta – sramij

+0

@sramij, no es necesario cambiar el motor de DB, solo tiene que volver a crear la base de datos usando 'suncdb'. –

0

Según entiendo, django intentará validar el modelo A y luego devolverá los errores de validación. Como A valida, intenta escribir A que falla porque B no valida. No estoy seguro de cómo hacerlo de forma elegante, pero si intenta evaluar el formulario B por sí solo antes de validar A obtendrá el mensaje "este campo es obligatorio" que luego puede mostrar al usuario.

4

Hay una función de utilidad en Django

from django.utils import timezone 
class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=timezone.now) 

Esta función le devolverá un objeto de fecha y hora basado en USE_TZ en settings.py

def now(): 
    """ 
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ. 
    """ 
    if settings.USE_TZ: 
     # timeit shows that datetime.now(tz=utc) is 24% slower 
     return datetime.utcnow().replace(tzinfo=utc) 
    else: 
     return datetime.now() 
Cuestiones relacionadas