86 votes

Options par défaut de Django DateField

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

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

Lorsque je vérifie l'application dans l'administration django intégrée, l'icône DateField a également l'heure en annexe, de sorte que si vous essayez de l'enregistrer, une erreur est renvoyée. Comment faire pour que la date soit la seule valeur par défaut ? ( datetime.today() ne fonctionne pas non plus)

157voto

Daniel Roseman Points 199743

C'est pourquoi vous devriez toujours importer la base datetime module : import datetime plutôt que le datetime dans ce module : from datetime import datetime .

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

Donc le champ devrait être :

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

0 votes

Y a-t-il un moyen de faire cela en ajoutant un delta de temps ? Par exemple : default=datetime.date.today + datetime.timedelta(days=4) ... ce code ne fonctionne pas, mais c'est l'idée. (Je reconnais que la méthode d'enregistrement est un endroit pour faire cela, mais je me demande juste s'il y a un moyen de le faire dans le cadre de la définition).

1 votes

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

27 votes

Qu'est-ce que _("Date") à faire ?

43voto

Votre erreur est d'utiliser le datetime au lieu du module date module. C'est ce que tu voulais faire :

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

Si vous souhaitez uniquement capturer la date du jour, la bonne façon de procéder est d'utiliser l'attribut auto_now_add paramètre :

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

Toutefois, le docs sur les champs de modélisation indiquent clairement que auto_now_add y auto_now sera toujours utilisent la date du jour et ne sont pas une valeur par défaut que vous pouvez remplacer.

0 votes

C'est bon à savoir auto_now_add . Une chose dont il faut être conscient est que cela crée un champ en lecture seule, ce qui est regrettable, bien que cela ait du sens pour les utilisateurs de auto_now .

9voto

andyshi Points 49
date = models.DateTimeField(default=datetime.now, blank=True)

5 votes

DateTimeField n'est pas le même. Si vous fournissez un datetime par défaut à un DateField, vous aurez des problèmes.

5voto

btk Points 835

Cela devrait faire l'affaire :

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

1 votes

Mon ami, je pense que vous l'avez mal lu. La question porte sur DateField et non sur DateTimeField.

2voto

Neil Points 1132

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

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

7 votes

Regardez documentation . Il n'est pas bon d'utiliser lambda comme enveloppe d'appel par défaut : Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.

0 votes

@pulina vous avez raison, mais dans ce cas, lorsque vous avez besoin de lier la date au fuseau horaire configuré, cela semble être la seule solution.

1 votes

Nope. Vous pouvez pointer une fonction réelle dans le code. Toute référence de fonction ou de méthode selon ce dans la connexion qui est un modèle de fonction de haut niveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X