Django DateField options par défaut
J'ai un modèle qui a une date time champ:
date = modèles.DateField(_("Date"), valeur par défaut=datetime.maintenant())
Lorsque je vérifie l'application dans le construit dans django admin, le DateField a aussi le temps ajouté à la fin, de sorte que si vous essayez de l'enregistrer il renvoie une erreur. Comment puis-je faire la juste valeur par défaut de la date? (datetime.aujourd'hui() ne fonctionne pas non plus)
Vous devez vous connecter pour publier un commentaire.
C'est pourquoi vous devriez toujours importer la base de
datetime
module:import datetime
, plutôt que de ladatetime
classe au sein de ce module:from datetime import datetime
.L'autre erreur que vous avez faite est d'appeler la fonction dans le défaut, avec le
()
. Cela signifie que tous les modèles obtiendrez la date au moment où la classe est d'abord définie - donc, si votre serveur reste en place pendant des jours ou des semaines sans redémarrage d'Apache, tous les éléments aurez même la date initiale.De sorte que le champ doit être:
_("Date")
faire?Caught AttributeError while rendering: 'datetime.date' object has no attribute 'date'
des idées pourquoi?from django.utils.translation import gettext as _
pour l'internationalisationlazy
version, doncfrom django.utils.translation import gettext_lazy as _
autrement de l'évaluation à l'importation de temps va cracher un "AppRegistryNotReady'django.utils.timezone
, aucune solution de contournement des idées?Vous avez une erreur est d'utiliser le module datetime au lieu de la date du module. Que vous vouliez faire ceci:
Si vous ne voulez capturer la date actuelle, la bonne façon de gérer cela est d'utiliser le auto_now_add paramètre:
Cependant, la modelfield docs clairement que auto_now_add et auto_now sera toujours utiliser la date et ne sont pas une valeur par défaut que vous pouvez modifier.
Cela devrait faire l'affaire:
Je pense que la meilleure façon de résoudre ce problème serait d'utiliser datetime appelable:
Noter que pas de parenthèses ont été utilisés. Si vous avez utilisé la parenthèse vous appelleriez l'
now()
fonction une seule fois (lors de la création du modèle). Au lieu de cela, vous passez le callable comme argument, donc être invoqué chaque fois qu'une instance de la création du modèle.De crédit à Django Rêveries. Je l'ai utilisé et fonctionne très bien.
Vous pouvez également utiliser
lambda
. Utile si vous utilisez django.utils.le fuseau horaire.maintenantNote that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.