[英]python django and datetime aware objects
我有一個django模型,有些model.DateTimeFields作為屬性。 因為用戶必須能夠單獨添加時間和日期,並且因為我希望能夠完全自定義在模板中呈現的日期和時間輸入,所以我執行了以下操作
class Entry(models.Model):
title = models.CharField(max_length=40)
body = models.CharField(max_length=10000, blank=True)
created = models.DateTimeField(auto_now_add=True)
start_date = models.DateField(default=datetime.now().date())
start_hour = models.TimeField(default=datetime.now().time())
start = models.DateTimeField()
end_hour = models.TimeField(default=(datetime.now()+ timedelta(minutes=45)).time())
end = models.DateTimeField()
表格
class EntryAddForm(ModelForm):
def __init__(self, *args, **kwargs):
super(EntryAddForm, self).__init__(*args, **kwargs)
self.fields['doctor'].queryset = Doctor.objects.all()
class Meta:
model = Entry
exclude = ('canceled','creator', 'reason','start', 'end')
widgets....#setting widgets here
def save(self, commit=True):
model = super(EntryAddForm, self).save(commit=False)
model.start = datetime.combine(self.cleaned_data['start_date'], self.cleaned_data['start_hour'])
model.end = datetime.combine(self.cleaned_data['start_date'], self.cleaned_data['end_hour'])
if commit:
model.save()
return model
因此,在save方法中,我創建了一個新的日期時間對象,其中包含開始日期和開始時間的組合
問題是當您將它們呈現在表單上進行編輯時。 因為輸入日期存儲在utc start_hour中,而end_hour不是從我從表單中保存它們但落后3小時的確切時間(因為我住在希臘,我的設置文件中有TIME_ZONE = Athens)。
是否真的有一種簡單的方法可以解決這個問題,或者解決方案是不使用感知對象?
還有一個小題目。 Javascript如何知道時區偏移量。 我做
x = new Date();
x.getTimeZoneOffset() / 60;
我得到-3這是正確的。 如果我在我的Ubuntu系統中更改我的時區,我的ubuntu時鍾會更改以匹配所選時區的時間,但上面的javascript代碼會返回相同的結果。 所以javascript不會使用系統時區?
它不直接解決您的時區問題,但您不應該在模型中執行此操作:
start_date = models.DateField(default=datetime.now().date())
start_hour = models.TimeField(default=datetime.now().time())
start = models.DateTimeField()
您已經使用冗余字段污染了數據模型,僅僅是為了更改UI - 進行此更改的正確位置在關聯的ModelForm(和模板)中
Django正是為了這個目的提供了https://docs.djangoproject.com/en/dev/ref/forms/widgets/#splitdatetimewidget 。
對於你的時區問題...如果您在設置中有USE_TZ = True
,那么Django將假設來自用戶輸入的所有日期和時間都是根據您的設置在TIME_ZONE = 'Athens'
...然后它將在保存之前將它們轉換為UTC db(並在檢索時將它們轉換回雅典時間)。
https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-USE_TZ
如果您需要處理用戶在各種時區提交的數據時間信息,可能更容易設置USE_TZ = False
...您的日期時間將不再USE_TZ = False
區信息,因此您應該將所有內容規范化為Django之外的UTC應用程序(即在JavaScript中)
我不確定你關於getTimeZoneOffset
的問題的答案 - 可能你需要重新啟動瀏覽器才能獲得對系統時區的更改?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.