设置Django管理员显示时间到当地时间?

时间:2017-03-07 17:36:27

标签: python django python-3.x

当我在管理员中看到日期和时间时,它们以UTC格式显示。我想让它们显示在我当地的时区。我检查了docs中的TIME_ZONE设置,但看起来并不像我想要的那样。 TIME_ZONE确定存储在数据库中的日期时间的时区,这不是我想要设置的时间 - 我只想localize管理员的时区,而不是更改它们的保存方式在数据库层面。

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:2)

在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)

这只是一个简单的硬编码。您可以制作一个表格来选择tzinfo,将其存储在用户的配置文件中并将其加载到用户会话中,然后从中间件中的会话中读取tzinfo。

官方文档有相关描述: https://docs.djangoproject.com/en/3.0/topics/i18n/timezones/#selecting-the-current-time-zone

参考:

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

答案 1 :(得分:1)

您可以覆盖change_list.htmlchange_form.html等模板,并执行以下操作:

{% extends "admin/change_list.html" %}
{% load tz %}

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

使用以下方法之一进行操作:

答案 2 :(得分:0)

从2.1开始,Django本身不支持此功能。但是https://github.com/charettes/django-sundial可能会提供您所需的内容-这会添加一个User.timezone模型字段,以便您可以按用户配置它。

(此中间件非常简单-在后台,它只是调用timezone.activate(zone)来更改渲染站点的时区)。

答案 3 :(得分:-2)

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

 USE_TZ = True

Official documentation