【发布时间】:2017-07-28 00:54:00
【问题描述】:
当我在管理员中看到日期和时间时,它们以 UTC 显示。我希望它们显示在我当地的时区。我检查了docs 中的TIME_ZONE 设置,尽管它看起来并不是我想要的。 TIME_ZONE 确定存储在数据库中的日期时间的时区,这不是我想要设置的 - 我只想 localize 管理员的时区,但不更改它们在数据库级别的保存方式.
有没有办法做到这一点?
【问题讨论】:
标签: python django python-3.x
当我在管理员中看到日期和时间时,它们以 UTC 显示。我希望它们显示在我当地的时区。我检查了docs 中的TIME_ZONE 设置,尽管它看起来并不是我想要的。 TIME_ZONE 确定存储在数据库中的日期时间的时区,这不是我想要设置的 - 我只想 localize 管理员的时区,但不更改它们在数据库级别的保存方式.
有没有办法做到这一点?
【问题讨论】:
标签: python django python-3.x
在 Django 中:
默认时区是由 TIME_ZONE 设置定义的时区。
当前时区是用于渲染的时区。
所以你应该设置“当前时区”使用:
django.utils.timezone.activate(时区)
您可以在中间件中激活它(不要伪造在 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
【讨论】:
您可以覆盖 change_list.html、change_form.html 等的模板并执行以下操作:
{% extends "admin/change_list.html" %}
{% load tz %}
{% block content %}
{% timezone "US/Eastern" %}
{{ block.super }}
{% endtimezone %}
{% endblock %}
使用其中一种方法进行操作:
【讨论】:
从 2.1 开始,Django 本身不支持此功能。但是https://github.com/charettes/django-sundial 可能会提供您需要的东西——这会添加一个User.timezone 模型字段,以便您可以为每个用户配置它。
(这个中间件非常简单——实际上它只是调用timezone.activate(zone) 来更改渲染站点的时区)。
【讨论】:
【讨论】: