将Django管理后台显示的时间设置为本地时间?

17
当我在管理员页面中看到日期和时间时,它们以UTC格式显示。我希望它们以本地时区的格式显示。我检查了文档中的TIME_ZONE设置,但它似乎并不是我想要的。 TIME_ZONE确定存储在数据库中的日期时间的时区,这并不是我要设置的 - 我只想为管理员的时区进行本地化,而不改变它们在数据库级别上的保存方式。

有没有办法实现这个功能?

4个回答

10

在Django中:

默认时区是由TIME_ZONE设置定义的时区。

当前时区是用于呈现的时区。

因此,您应该使用以下方式设置"当前时区"

django.utils.timezone.activate(timezone)

您可以在中间件中激活它(不要忘记在settings.py的MIDDLEWARE中进行注册):

import pytz    
from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        timezone.activate(pytz.timezone('Asia/Shanghai')
        return self.get_response(request)

这只是一个简单的硬编码。你可以制作一个表单来选择时区信息,将其存储在用户资料中并加载到用户会话中,在中间件中从会话中读取时区信息。

官方文档有相关说明:https://docs.djangoproject.com/zh-hans/3.2/topics/i18n/timezones/#selecting-the-current-time-zone

参考资料:

https://groups.google.com/forum/#!topic/django-developers/E4aiv3O6vGo


在Python 3.9+中,您不需要使用pytz,可以将字符串传递给activatezoneinfo.ZoneInfo对象。 - pphysch

4
截至2.1版本,Django本身并不支持此功能。但是,https://github.com/charettes/django-sundial 可能会提供您所需的功能 - 它添加了一个 User.timezone 模型字段,因此您可以为每个用户进行配置。
(这个中间件非常简单 - 在后台只是调用timezone.activate(zone)来更改呈现网站的时区)。

2
您可以覆盖您的change_list.html, change_form.html等模板,并进行以下操作:”最初的回答“。
{% extends "admin/change_list.html" %}
{% load tz %}

{% block content %}
    {% timezone "US/Eastern" %}
        {{ block.super }}
    {% endtimezone %}
{% endblock %}

使用以下方法之一: 最初的回答。

我遵循这个方法,但对于某些表单,似乎会更新日期时间而不带时区偏移量。你有注意到这个问题吗? - Harry Moreno
这已经有一段时间了,自上次尝试以来。那些表格或字段有什么特别之处吗? - fjsj
不对,如果按照你所提供的指示操作,你会注意到日期编辑字段接受UTC时间。因此,为了避开这个问题,在保存模型之前,我会确保将所有日期都编辑为UTC时间。 - Harry Moreno

-9

也许你可以尝试设置用户时区。 设置

 USE_TZ = True

官方文档


我已经将其设置为true了 - 该设置控制是否使用时区感知日期。 - orange1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接