web-dev-qa-db-ja.com

Django DateFieldデフォルトオプション

日時フィールドを持つモデルがあります:

日付= models.DateField(_( "Date")、default = datetime.now())

ビルトインDjango adminでアプリをチェックすると、DateFieldにも時間が追加されるため、保存しようとするとエラーが返されます。日付だけ?(datetime.today()も機能していません)

69
damon

常にベースdatetimeモジュールをインポートする必要がある理由:import datetime、そのモジュール内のdatetimeクラスではなく:from datetime import datetime

あなたが犯した他の間違いは、実際にデフォルトで関数を呼び出すことで、()。これは、クラスが最初に定義された時点ですべてのモデルが日付を取得することを意味します-したがって、Apacheを再起動せずにサーバーが数日または数週間稼働している場合、すべての要素は最初の日付と同じになります。

したがって、フィールドは次のようになります。

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

日付モジュールの代わりに日付時刻モジュールを使用しているのは間違いです。これを行うつもりでした:

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

現在の日付のみをキャプチャする場合、これを処理する適切な方法は、auto_now_addパラメーターを使用することです。

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

ただし、 modelfield docs は、auto_now_addとauto_nowが常にalwaysを使用することを明示しており、デフォルト値ではありませんオーバーライドできます。

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

これはトリックを行う必要があります:

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

lambdaを使用することもできます。 Django.utils.timezone.now を使用している場合に役立ちます

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

これを解決するより良い方法は、datetime callableを使用することだと思います:

_from datetime import datetime

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

括弧が使用されていないことに注意してください。括弧を使用した場合は、now()関数を1回だけ呼び出します(モデルの作成時)。代わりに、callableを引数として渡します。したがって、モデルのインスタンスが作成されるたびに呼び出されます。

Django Musings の功績。私はそれを使用し、正常に動作します。

1
ppicom