Python django和日期时间感知对象



我有一个django模型,一些模型。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时间(检索时将它们转换回雅典时间)。
https://docs.djangoproject.com/en/dev/ref/settings/std: setting-USE_TZ

如果需要处理不同时区用户提交的数据时间信息,设置USE_TZ = False…你的日期时间将不再有时区信息,所以你应该在Django应用程序之外(即在javascript中)将所有内容规范化为UTC

我不确定你的问题关于getTimeZoneOffset的答案-可能你需要重新启动浏览器之前,它拿起改变系统时区?

相关内容

  • 没有找到相关文章

最新更新