Opciones predeterminadas de Django DateField

82

Tengo un modelo que tiene un campo de fecha y hora:

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

Cuando verifico la aplicación en el administrador de django integrado, DateFieldtambién se le agrega el tiempo, de modo que si intenta guardarlo, se devuelve un error. ¿Cómo hago que el valor predeterminado sea solo la fecha? ( datetime.today()tampoco funciona)

demonio
fuente

Respuestas:

150

Es por eso que debe siempre importar la base datetimedel módulo:import datetime en lugar de la datetimeclase dentro de ese módulo: from datetime import datetime.

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

Entonces el campo debería ser:

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
Daniel Roseman
fuente
¿Hay alguna forma de hacer esto agregando un delta de tiempo? Por ejemplo: default = datetime.date.today + datetime.timedelta (días = 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 manera de hacerlo como parte de la definición)
Joe J
1
@Joe J: esta debería ser una pregunta nueva realmente. Pero el hecho de que pueda usar un invocable significa que puede definir su propia función que devuelve hoy + 4.
Daniel Roseman
23
Que esta _("Date")haciendo
benregn
10
@benregn Le da al campo una etiqueta de "Fecha" pero lo marca para su traducción usando el sistema de internacionalización.
Daniel Roseman
Gracias por aclarar eso, acabo de comenzar el desarrollo de Django y no estaba claro para mí si estaba haciendo más que solo etiquetado.
benregn
38

Tu error es usar el datetimemódulo en lugar del datemódulo. Querías hacer esto:

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

Si solo desea capturar la fecha actual, la forma correcta de manejar esto es usar el auto_now_addparámetro:

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

Sin embargo, los documentos modelfield estado claramente que auto_now_addy auto_nowserá siempre usar la fecha actual y no son un valor predeterminado que se puede anular.

Eric Palakovich Carr
fuente
8
date = models.DateTimeField(default=datetime.now, blank=True)
andyshi
fuente
5
DateTimeField no es lo mismo. Si proporciona una fecha y hora como predeterminada para un DateField, tendrá problemas.
onekiloparsec
6

Creo que una mejor manera de resolver esto sería usar la fecha y hora invocables:

from datetime import datetime

date = models.DateField(default=datetime.now)

Tenga en cuenta que no se utilizaron paréntesis. Si usó paréntesis, invocaría la now()función solo una vez (cuando se crea el modelo). En su lugar, pasa el invocable como un argumento, por lo que se invoca cada vez que se crea una instancia del modelo.

Crédito a Django Musings . Lo he usado y funciona bien.

ppicom
fuente
4

Esto debería funcionar:

models.DateTimeField(_("Date"), auto_now_add = True)
btk
fuente
1
amigo mío creo que lo leíste mal. La pregunta es sobre DateField, no sobre DateTimeField.
xxbinxx
2

También puede utilizar lambda. Útil si estás usando django.utils.timezone.now

date = models.DateField(_("Date"), default=lambda: now().date())
Neil
fuente
6
Mira la documentación . No es bueno utilizar como predeterminado lambda envoltorio exigible: Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.
pulina
@pulina, tiene razón, pero en este caso, cuando necesita una fecha vinculada a la zona horaria configurada, esta parece ser la única solución
oxfn
No Puede señalar una función real en el código. Cualquier función o referencia de método de acuerdo con esto en relación con la función de nivel superior del modelo.
pulina