django-tz-detect 自动将时区保存到用户模型

django-tz-detect automatically save timezone to user model

我想在 django-tz-detect 包检测到用户的时区后自动将其保存到他们的配置文件中。

用例:我有一个简单的应用程序,允许用户注册和预订时间段。

特点:

问题:发送给用户的电子邮件未按照当地时区进行格式化,因为 django-tz-detect 只关注该会话的当前时区。

如何在提醒邮件中设置用户当地时区的时间格式?

这可以通过简单的自定义中间件来完成。

确保您使用的是 django-tz-detect。

INSTALLED_APPS = [
    # ...
    'tz_detect',
    'myapp.apps.MyappConfig',
]

在 django-tz-detect 之后将您自己的中间件添加到堆栈中。

MIDDLEWARE = [
    # ...
    'tz_detect.middleware.TimezoneMiddleware',
    'myapp.middleware.UserTimezoneMiddleware',
]

myapp/middleware.py

from django.utils import timezone

class UserTimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        if request.user.is_authenticated:
            if request.session.get('detected_tz'): # (set by django-tz-detect)
                tz = timezone.get_current_timezone()
                if tz:
                    tz = str(tz)
                    # (this assumes your user model has a char field called "timezone")
                    if tz != request.user.timezone:
                        request.user.timezone = tz
                        request.user.save()

        return response

时区字符串(例如“America/Chicago”)现在会自动保存到用户模型中,并在用户从不同时区登录时更新。