基于每对象timezon的Django保存datetime

2024-10-03 19:31:22 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的大多数应用程序来说,用时区保存日期时间和使用时区设置都可以。我的问题是,如何保存一个日期时间为UTC格式的模型,但日期时间已设置好,以便转换回用户输入的时区是正确的?模型、视图、表单和html如下所示。如果在设置.py文件,但我想保留项目中其他所有内容的时区。在

型号:

class TZTestModel(models.Model):
    timezone = TimeZoneField()
    dt = models.DateTimeField()

视图:

^{pr2}$

形式:

class TZTestForm(forms.ModelForm):
    class Meta:
        model = TZTestModel

    def clean(self):
        timezone = self.cleaned_data['timezone']
        dt = self.cleaned_data['dt']
        dt = timezone.localize(dt)
        self.cleaned_data['dt'] = pytz.UTC.normalize(dt.astimezone(pytz.UTC))
        return self.cleaned_data

模板:

<html>
    <body>
        <form method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit">
        </form>
    </body>
</html>

示例:

我希望能够在13:00输入“US/Alaska”时区和datetime,将其保存为UTC值,然后能够转换回“US/Alaska”并获得正确的值。在

实际上,我试图将一个模型的datetime保存在与我的应用程序不同的时区中,其中时区由用户以指定日期时间的相同形式指定。在


Tags: 用户模型selfform视图应用程序datahtml
2条回答

编辑:表单域的粘贴源:http://pastebin.com/j4TnnHTS 进一步讨论:https://code.djangoproject.com/ticket/21300

这样做的方法似乎是创建一个返回原始日期时间的自定义表单字段,然后将其转换为用户指定的时区,然后将其转换为UTC。在

自定义字段:

^{1}$

形式:

^{pr2}$

我对对象级时区也有同样的问题。在

我找到了this blog entry。它并不完美,但它有效!并且不太复杂。加上处理管理员处理。在

将片段粘贴到此处:

确保表单在所需时区内处理:

^{1}$

在管理列表视图中正确显示

^{pr2}$

正确解释管理添加视图中的日期

class EventAdmin(admin.ModelAdmin):
    # ...

    # Override add view so we can peek at the timezone they've entered and
    # set the current time zone accordingly before the form is processed
    def add_view(self, request, form_url='', extra_context=None):
        if request.method == 'POST':
            tz_form = TimeZoneForm(request.POST)
            if tz_form.is_valid():
                timezone.activate(tz_form.cleaned_data['event_time_zone'])
        return super(EventAdmin, self).add_view(request, form_url, extra_context)

在管理编辑视图中正确处理时区

class EventAdmin(admin.ModelAdmin):
    # ...

    # Override change view so we can peek at the timezone they've entered and
    # set the current time zone accordingly before the form is processed
    def change_view(self, request, object_id, form_url='', extra_context=None):
        if request.method == 'POST':
            tz_form = TimeZoneForm(request.POST)
            if tz_form.is_valid():
                timezone.activate(tz_form.cleaned_data['event_time_zone'])
        else:
            obj = self.get_object(request, unquote(object_id))
            timezone.activate(obj.event_time_zone)
        return super(EventAdmin, self).change_view(request, object_id, form_url, extra_context)

相关问题 更多 >