2010-01-08 7 views
60

j'ai un modèle qui a un champ de date heure:options par défaut Django DateField

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

Quand je vérifie l'application dans la construction django admin, DateField a aussi le temps qui lui est annexé, de sorte que si vous essayez de le sauvegarder, il renvoie une erreur. Comment puis-je faire la valeur par défaut juste la date? (datetime.today() ne fonctionne pas non plus)

Répondre

107

C'est pourquoi vous devez toujours importer la base datetime Module: import datetime, plutôt que la classe datetime au sein de ce module: from datetime import datetime.

L'autre erreur que vous avez faite est d'appeler réellement la fonction par défaut, avec le (). Cela signifie que tous les modèles auront la date au moment où la classe est définie pour la première fois - donc si votre serveur reste en place pendant plusieurs jours ou semaines sans redémarrer Apache, tous les éléments recevront la même date initiale.

Ainsi, le champ doit être:

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

Existe-t-il un moyen d'ajouter un delta temporel? Par exemple: default = datetime.date.today + datetime.timedelta (days = 4) ... ce code ne fonctionne pas, mais c'est l'idée. (Certes, la méthode de sauvegarde est un endroit pour faire cela, mais je me demandais simplement s'il y avait un moyen de le faire dans le cadre de la définition) –

+1

@Joe J: cela devrait vraiment être une nouvelle question. Mais le fait que vous puissiez utiliser un callable signifie que vous pouvez simplement définir votre propre fonction qui revient aujourd'hui + 4. –

+9

Que fait '_ (" Date ")'? – benregn

28

Vous vous trompez en utilisant le module datetime au lieu du module de date. Vous vouliez faire:

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

Si vous voulez seulement saisir la date actuelle la bonne façon de gérer cela est d'utiliser le paramètre auto_now_add:

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

Cependant, l'modelfield docs précise clairement que auto_now_add et auto_now toujours utiliser la date actuelle et ne sont pas une valeur par défaut que vous pouvez remplacer.

3

Cela devrait faire l'affaire:

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

mon ami je pense que vous l'avez mal lu. La question concerne DateField ne concerne pas DateTimeField. – xxbinxx

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

DateTimeField n'est pas identique. Si vous fournissez un datetime par défaut à un champ DateField, vous aurez des problèmes. – onekiloparsec

1

Vous pouvez également utiliser lambda. Utile si vous utilisez django.utils.timezone.now

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

Regardez [documentation] (https://docs.djangoproject.com/fr/1.7/ref/models/fields/#default). Il n'est pas bon d'utiliser lambda comme encapsulable par défaut: 'Notez que lambdas ne peut pas être utilisé pour les options de champs comme par défaut car ils ne peuvent pas être sérialisés par des migrations. Voir cette documentation pour d'autres mises en garde. – pulina

Questions connexes