2012-12-28 69 views
10

我有一個DateTimeField字段的模型:帶有UTC偏移量的django DateTimeField?

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

應該允許用戶輸入日期,時間和時區信息領域。這是我想要的格式:

2012-12-31 23:30 +0430 

我希望時間將存儲到數據庫之前轉換爲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不能處理th e「%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' 

我真的覺得這應該工作。我是否錯過了其他文檔的某些部分?

+0

你嘗試[input_formats(https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.DateTimeField.input_formats)? – Vidul

+0

@ВидулПетров沒有運氣,看編輯 – frnhr

+0

@Сек:請嘗試'input_formats =('%Y-%m-%d%H:%M%z',)' – Vidul

回答

9

當你設置你的設置USE_TZ = True,Django的存儲日期和UTC在數據庫中的時間信息,否則它將存儲天真日期時間(日期時間無時區)。

在大多數情況下,使用Django的時區支持非常方便,因爲輸入和輸出日期時間將由Django自動轉換。

但是,如果您確實需要用戶輸入的時區,則需要設置USE_TZ = False,然後使用DateTimeField這個天真的日期時間以及CharField將時區信息存儲在您的models.py中。

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

+0

此設置使用「活動」時區(由TimeZoneMiddleware設置);不能強迫它使用另一個時區 – Don