Django DateTimeField со смещением UTC?

У меня есть модель с DateTimeField:

deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)

Пользователям должно быть разрешено вводить информацию о дате, времени и часовом поясе в поле. Это мой желаемый формат:

2012-12-31 23:30 +0430

Я ожидаю, что время будет преобразовано в UTC перед сохранением в db. Поэтому я попытался использовать модельную форму для этого, но он выдает ошибку проверки Enter a valid date/time. на этом DateTimeField, если я введу значение выше.

Это находится в settings.py:

DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )

Что мне не хватает?

Edit:

В соответствии с предложением Видул Петров, попытался использовать поле формы:

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'

Я действительно чувствую, что это должно сработать. Я пропустил часть документов, которые говорят иначе?

Ответ 1

Когда вы устанавливаете USE_TZ = True в своих настройках, Django хранит информацию о дате и времени в формате UTC в базе данных, иначе он будет хранить дату наивное дату (время даты без часовой пояс).

В большинстве случаев поддержка часовых поясов Django очень удобна, потому что дата и время ввода и вывода будут автоматически транслироваться Django.

Но если вам действительно нужен запрос часового пояса от вашего пользователя, вам нужно установить USE_TZ = False, а затем использовать DateTimeField, который является наивным datetime вместе с CharField, для хранения информации о часовом поясе в ваших models.py.

ref: https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/