web-dev-qa-db-fra.com

Django Options par défaut de DateField

J'ai un modèle qui a un champ date/heure:

date = models.DateField (_ ("Date"), valeur par défaut = datetime.now ())

Lorsque je vérifie l'application dans la version intégrée Django admin, le champ DateField est également ajouté à l'heure, de sorte que si vous essayez de la sauvegarder, le système retourne une erreur. Comment définir le paramètre par défaut juste la date? (datetime.today () ne fonctionne pas non plus)

69
damon

C’est pourquoi vous devriez importez toujours la base datetime module: import datetime, plutôt que la classe datetime de ce module: from datetime import datetime.

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

Donc, le champ devrait être:

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
130
Daniel Roseman

Votre erreur est d'utiliser le module datetime au lieu du module de date. Vous vouliez faire ceci:

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

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

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

Toutefois, les modelfield docs indiquent clairement que auto_now_add et auto_now utiliseront toujours la date du jour et ne constituent pas une valeur par défaut. peut remplacer.

30
date = models.DateTimeField(default=datetime.now, blank=True)
8
andyshi

Cela devrait faire l'affaire:

models.DateTimeField(_("Date"), auto_now_add = True)
4
btk

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

date = models.DateField(_("Date"), default=lambda: now().date())
2
Neil

Je pense qu'une meilleure façon de résoudre ce problème serait d'utiliser le datable callable:

from datetime import datetime

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

Notez qu'aucune parenthèse n'a été utilisée. Si vous utilisez des parenthèses, vous n’appelez la fonction now() qu’une seule fois (à la création du modèle). Au lieu de cela, vous transmettez l'appelable en tant qu'argument, invoquant ainsi chaque fois qu'une instance du modèle est créée.

Crédit à Django Musings . Je l'ai utilisé et fonctionne bien.

1
ppicom