DateTimeFieldを持つモデルがあります:
deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)
ユーザーは、フィールドに日付、時刻、およびタイムゾーン情報を入力できるようにする必要があります。これは私の望ましいフォーマットです:
2012-12-31 23:30 +0430
Dbに保存する前に、時刻がUTCに変換されることを期待しています。そのためにモデルフォームを使用しようとしましたが、上記の値を入力すると、そのDateTimeFieldでEnter a valid date/time.
検証エラーがスローされます。
これはsettings.pyにあります:
DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )
何が足りないのですか?
編集:
ВидулПетровの提案に従って、フォームフィールドを使用しようとしました:
deadline2 = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %Z',],
同じ効果が得られました:Enter a valid date/time.
編集2
Datetimeは "%z"パラメーターを処理できないようです。これはValueErrorをスローします:
datetime.datetime.strptime(value, format)
だから私はコンソールでそれをテストしました:
>>> import datetime
>>> datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M %z'
また、pytzを試しました:
>>> import pytz
>>> pytz.datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M %z'
私はこれがうまくいくはずだと本当に感じています。それ以外のことを言っているドキュメントの一部を見逃しましたか?
設定でUSE_TZ = True
を設定すると、Djangoは日付と時刻の情報をUTCでデータベースに保存します。それ以外の場合は、naive日付を保存します。時間(タイムゾーンのない日時)。
ほとんどの場合、入力と出力の日時はDjangoによって自動的に変換されるため、Djangoのタイムゾーンサポートを使用すると非常に便利です。
ただし、ユーザーからのタイムゾーン入力が本当に必要な場合は、USE_TZ = False
を設定してから、CharFieldとともにナイーブな日時であるDateTimeFieldを使用して、models.pyにタイムゾーン情報を格納する必要があります。
参照: https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/