【问题标题】:datetime fields are saved with different values and show different values in forms django日期时间字段以不同的值保存,并在 django 表单中显示不同的值
【发布时间】:2013-12-07 05:42:58
【问题描述】:

我有一个模型,其中有一个 DateTimeField。

class Event(models.Model):
    .....
    date = models.DateTimeField()

以及本次活动的模板

class EventForm(ModelForm):

    class Meta:
        model= Event

当我从管理员创建事件时,我将时间设置为我希望事件发生的时间,比如 19:30。但是,如果我调用 events.date 属性,我会得到

event.date
datetime.datetime(2013, 11, 20, 17, 30, tzinfo=<UTC>)

如果我在像这样的模板中使用它

{{event.date.hour}}:{{event.date.minute}}

显示 17:30。

但是当我将它加载到模型表单中的模板上时

event_form = EventForm(instance=event)

在模板中

{{event_form.as_p}}

然后显示的日期与我在管理页面中添加的相同,即 19:30

我怎样才能改变这种行为。 django 是否总是以 UTC 格式保存日期?我在希腊,因此 datetime 对象的负 2 小时(我认为)。假设我的应用程序将在许多不同的国家/地区运行,我可以自动执行此操作吗,例如当我使用属性在模板上呈现日期时,它将显示实际保存的时间,而不是 UTC 时间。希望我说得通....

在我的设置文件中有

TIME_ZONE = 'Europe/Athens'
USE_TZ = True

【问题讨论】:

    标签: python django datetime timezone django-timezone


    【解决方案1】:

    如果您想要每个用户的时区,您需要将其存储在您的用户配置文件或类似的东西中。然后使用该信息将用户输入的时间转换为适当的 UTC 进行存储。

    如果您没有按照服务器上设置的时区存储时间。因此,如果 GMT 中的某个用户选择时间为 0800,则它实际上是 雅典 中的 0800,而不是 GMT。

    在模板中你可以做

    {% load tz %}
    
    {% timezone get_current_users_timezone %}
        {{ event.date }}
    {% endtimezone %}
    

    详情请参考django timezones

    【讨论】:

    • 检查我是否做对了。如果 USE_TZ: 则所有白天对象都存储为 UTC,当在模板和表单中呈现时,使用 TIME_ZONE 在用户的时区显示日期时间。正确的?如何在视图中更改日期时间的 tzinfo?如果托管在 TIME_ZONE=x 的服务器上,并且用户从 TIME_ZONE=y 登录,django 怎么知道?我也可以在视图中使用它吗?
    • @Apostolos,鉴于您需要执行类似timezone.activate(tz) 的操作,其中tz 是用户的时区(可以存储在用户配置文件中),请参阅docs.djangoproject.com/en/dev/topics/i18n/timezones/…
    • 我明白了......所以答案是否定的(我也读过它只是为了确保),除非他在用户配置文件设置等中指定了用户的时区,否则你不能让 django 知道用户的时区。得到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2017-02-22
    • 2019-11-20
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多