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”)现在会自动保存到用户模型中,并在用户从不同时区登录时更新。
我想在 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”)现在会自动保存到用户模型中,并在用户从不同时区登录时更新。