2010-01-08 16 views
60

tengo un modelo que tiene un campo de fecha y hora:opciones predeterminadas Django DateField

date = models.DateField(_("Date"), default=datetime.now())

Cuando compruebo la aplicación en el construido en la administración de Django, DateField también tiene el tiempo anexa a la misma, de manera que si Intenta guardarlo devuelve un error. ¿Cómo hago que el valor predeterminado sea solo la fecha? (datetime.today() tampoco funciona)

Respuesta

107

Esto es por lo que debe importar siempre la base datetime módulo: import datetime, en lugar de la clase datetime dentro de ese módulo: from datetime import datetime.

El otro error que ha cometido es llamar realmente a la función en el valor predeterminado, con (). Esto significa que todos los modelos obtendrán la fecha en el momento en que se define por primera vez la clase, de modo que si su servidor permanece activo durante días o semanas sin reiniciar Apache, todos los elementos obtendrán la misma fecha inicial.

lo tanto, el campo debe ser:

import datetime 
date = models.DateField(_("Date"), default=datetime.date.today) 
+0

¿Hay alguna manera de hacer esto agregando un delta de tiempo? Por ejemplo: default = datetime.date.today + datetime.timedelta (days = 4) ... este código no funciona, pero esa es la idea. (Por supuesto, el método de guardar es un lugar para hacer esto, pero me pregunto si hay una forma de hacerlo como parte de la definición) –

+1

@Joe J: esta debería ser una nueva pregunta realmente. Pero el hecho de que pueda usar un invocable significa que puede definir su propia función que devuelve hoy + 4. –

+9

¿Qué está haciendo '_ (" Fecha ")'? – benregn

28

Error al utilizar el módulo de fecha y hora en lugar del módulo de fecha. Que significaba para hacer esto:

from datetime import date 
date = models.DateField(_("Date"), default=date.today) 

Si sólo desea capturar la fecha actual la forma correcta de manejar esto es usar el parámetro auto_now_add:

date = models.DateField(_("Date"), auto_now_add=True) 

Sin embargo, el modelfield docs establecen claramente que auto_now_add y auto_now será siempre usan la fecha actual y no son un valor predeterminado que puede anular.

3

Esto debería hacer el truco:

models.DateTimeField(_("Date"), auto_now_add = True) 
+0

mi amigo, creo que lo leyó mal. La pregunta es sobre DateField no sobre DateTimeField. – xxbinxx

6
date = models.DateTimeField(default=datetime.now, blank=True) 
+0

DateTimeField no es lo mismo. Si proporciona una fecha y hora como valor predeterminado en un campo de fecha, tendrá problemas. – onekiloparsec

1

También es posible usar lambda. Útil si está usando django.utils.timezone.now

date = models.DateField(_("Date"), default=lambda: now().date()) 
+3

Mire [documentación] (https://docs.djangoproject.com/en/1.7/ref/models/fields/#default). No es bueno usar lambda como envoltorio invocable predeterminado: 'Tenga en cuenta que lambdas no se puede usar para opciones de campo como el predeterminado porque no pueden ser serializadas por migraciones. Ver esa documentación para otras advertencias. – pulina

Cuestiones relacionadas