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,并根据用户的时区调整值,则必须手动执行此操作。