Django 时区问题
Django Time Zone issue
我的 Django 应用程序中的时区有很多问题。
为了便于解释,我将直接跳到示例:
我有一个具有 TimeField(null=True, blank=True) 的对象,我基本上想根据用户时区显示这个时间。
我有一个中间件 class 可以为经过身份验证的用户激活时区:
#'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")
中提取时区,它基本上告诉我时区用户 selected.
这一切都很好,直到我需要呈现用户时区采用的时间。
所以在我的例子中,用户有 'Pacific/Honolulu' 时区。对象时间字段已保存到 'American/New_York' 时区,无论我 select.
哪个时区,我仍然得到相同的时间
我做错了什么?
(我正在参考官方文档)
这是我的模板:
{% 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
再一次,用户 select 设置时区,如果用户登录,中间件会处理它,并且...由于某种原因没有任何变化。
你会做正确的事——如果你有DateTimeField
。但是,正如文档 says:
Django only supports naive time objects and will raise an exception if you attempt to save an aware time object, as a timezone for a time with no associated date does not make sense.
因此 none Django 的时区支持适用于 TimeField
。如果您真的想使用 TimeField
,并根据用户的时区调整值,则必须手动执行此操作。
我的 Django 应用程序中的时区有很多问题。
为了便于解释,我将直接跳到示例:
我有一个具有 TimeField(null=True, blank=True) 的对象,我基本上想根据用户时区显示这个时间。
我有一个中间件 class 可以为经过身份验证的用户激活时区:
#'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")
中提取时区,它基本上告诉我时区用户 selected.
这一切都很好,直到我需要呈现用户时区采用的时间。
所以在我的例子中,用户有 'Pacific/Honolulu' 时区。对象时间字段已保存到 'American/New_York' 时区,无论我 select.
哪个时区,我仍然得到相同的时间我做错了什么?
(我正在参考官方文档)
这是我的模板:
{% 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
再一次,用户 select 设置时区,如果用户登录,中间件会处理它,并且...由于某种原因没有任何变化。
你会做正确的事——如果你有DateTimeField
。但是,正如文档 says:
Django only supports naive time objects and will raise an exception if you attempt to save an aware time object, as a timezone for a time with no associated date does not make sense.
因此 none Django 的时区支持适用于 TimeField
。如果您真的想使用 TimeField
,并根据用户的时区调整值,则必须手动执行此操作。