【问题标题】:django-tz-detect automatically save timezone to user modeldjango-tz-detect 自动将时区保存到用户模型
【发布时间】:2021-07-26 00:44:06
【问题描述】:

我想在 django-tz-detect 包检测到用户的时区后自动将其保存到他们的个人资料中。

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

特点:

  • 为用户提供尽可能少的开销。只需使用姓名和电子邮件地址进行注册,然后点击按钮即可预订时间段。
  • 管理员用户可以在用户的​​时间段临近时向用户发送电子邮件提醒。

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

如何在提醒电子邮件中以用户的本地时区格式化时间?

【问题讨论】:

    标签: django timezone middleware


    【解决方案1】:

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

    确保您使用的是 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”)现在会自动保存到用户模型中,并在用户从不同的 tz 登录时更新。

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2011-11-14
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2010-10-26
      • 2020-08-23
      • 2011-01-14
      相关资源
      最近更新 更多