【发布时间】:2021-01-26 18:00:56
【问题描述】:
我的 Django 应用程序中的 TimeZones 有很多问题。
出于解释的目的,我将直接跳到示例:
我有一个具有 TimeField(null=True, blank=True) 的对象,我基本上想根据用户的时区显示这个时间。
我有一个中间件类,它为经过身份验证的用户激活时区:
#'middleware.py'
import pytz
from django.utils import timezone
class TimezoneMiddleware(object):
"""
Middleware to properly handle the users timezone
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated:
timezone.activate(pytz.timezone(request.user.timezone))
else:
timezone.deactivate()
response = self.get_response(request)
return response
接下来,我从用户模型字段timezone = models.CharField(max_length=128, choices=[(tz, tz) for tz in ['UTC'] + pytz.country_timezones('US')], default="UTC") 中提取时区,它基本上告诉我用户选择的时区。
在我需要将采用的时间呈现给用户时区之前,这一切都很好。
所以在我的情况下,用户拥有“太平洋/檀香山”时区。对象时间字段已保存到“美国/纽约”时区,无论我选择哪个时区,我仍然得到相同的时间。
我做错了什么?
(为此我正在研究官方文档)
这是我的模板:
{% load tz %}
{% get_current_timezone as TIME_ZONE %}
{% for object in objects %}
{% localtime on %}
{{ object.min_reservation_time }}
{% endlocaltime %}
{% endear %}
另外 - 当我尝试在这个确切的模板中渲染 {{TIME_ZONE}} 时 - 我什么也没得到。
这是我的 settings.py :
TIME_ZONE = 'UTC' # Default timezone if custom timezone is not activated by middleware
USE_I18N = True
USE_L10N = True
USE_TZ = True
所以再一次,用户选择时区,如果用户登录,中间件会处理它,并且......由于某种原因没有任何变化。
【问题讨论】:
标签: python django timezone pytz django-timezone