问题描述
在我的Django应用程序中,TimeZones有很多麻烦。
出于解释目的,我将直接跳至示例:
我有一个具有TimeField(null = True,blank = True)的对象,基本上我想根据用户的时区显示此时间。
我有一个Middleware类,该类可将时区激活给经过身份验证的用户:
#'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
因此,用户再选择一次时区,如果用户登录,则由中间件对其进行处理,并且...由于某种原因没有任何变化。
解决方法
您会做正确的事- 如果您有DateTimeField
。但是,作为文档says:
Django仅支持朴素的时间对象,并且如果您尝试保存有意识的时间对象,则会引发异常,因为没有关联日期的时间的时区没有意义。
因此Django的时区支持都不适用于TimeField
。如果您确实要使用TimeField
,并根据用户的时区调整值,则必须手动进行操作。