以Django形式手动设置时区

时间:2016-03-21 03:20:08

标签: python django datetime

我已经阅读了很多关于在datetime对象上更改时区的正确和错误方法的文档和其他SO问题。我知道正确的用法是pytz并使用.localize和/或.astimezone而不是使用.replace。

我试图弄清楚如何允许用户在表单中输入时区。我不想使用本地化的浏览器设置来确定用户的时区;用户应该能够指定在将datetime对象保存到数据库之前应用于哪个时区。我已经在模型上放置了django-timezone-field的TimeZoneField,但我无法弄清楚如何将它正确地应用到datetime对象。

我尝试的所有东西实际上都会转换时间。这是我必须在模板中的javascript中而不是在python中执行的操作吗?

2 个答案:

答案 0 :(得分:1)

使用.replace(tzinfo=None)使日期时间变得幼稚。 (ref

然后使用tz.localize从时区字段应用时区。 (ref

答案 1 :(得分:0)

您可以按以下方式覆盖模型上的save()方法:

import pytz
from django.db import models

class Event(models.Model):
    """A model with a datetime field whose timezone appears in a separate field."""

    starts_at = models.DateTimeField("Start date and time")
    timezone = models.CharField("Timezone", max_length=128, 
                   choices=[(tz, tz) for tz in pytz.all_timezones if tz.startswith("US")])

    def save(self, *args, **kwargs):
        tz = pytz.timezone(self.timezone)
        self.starts_at = self.starts_at.replace(tzinfo=None)
        self.starts_at = tz.localize(self.starts_at)
        super().save(*args, **kwargs)