簡體   English   中英

python django和日期時間感知對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM