根据用户的时区显示 Django Admin DateTimeField
Show Django Admin DateTimeField accordingly to User's timezone
在 Django 中我有两个模型——用户和信息亭
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(_('username'), max_length=30, unique=True)
email = models.EmailField(_('email'), max_length=254, unique=True)
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=30, blank=True)
is_staff = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
role = models.CharField(
'User Role',
choices=ROLES,
default='agent',
max_length=15)
updated_on = models.DateTimeField('Updated on', auto_now=True)
timezone = TimeZoneField(default='America/Los_Angeles')
locations = models.ManyToManyField(Location, blank=True)
class Kiosk(models.Model):
'''Kiosk unit'''
name = models.CharField('Name', max_length=60)
enabled = models.BooleanField('Enabled', default=True)
created_on = models.DateTimeField('Created on', auto_now_add=True)
updated_on = models.DateTimeField('Updated on', auto_now=True)
last_check_in = models.DateTimeField('Last Time Checked In', null=True)
我需要在 Django Admin 中根据用户 (request.user.timezone) 中的 timezone
字段表示时间戳 created_on, updated_on, last_check_in
。
我想创建自定义 Widget
但在这种情况下我需要手动将它添加到每个时间戳字段,这听起来不对,尤其是考虑到我想在未来扩展的考虑添加更多带有时间戳的模型。
还有没有更多的pythonic解决方案?
谢谢!
要根据 request.user.timezone
应用您的自定义 Timezone
,需要:
- 在
app/middleware.py
中创建中间件
我基本上 运行 timezone.activate()
如果用户不是匿名的,并且时区是从当前用户模型中获得的
import pytz
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_anonymous:
tzname = request.user.timezone
timezone.activate(tzname)
else:
timezone.deactivate()
return self.get_response(request)
- 将其添加到
settings.py
中已安装的中间件
MIDDLEWARE = [
...
'app.middleware.TimezoneMiddleware'
]
在这个例子中,我使用了 pytz
外部 python 库。我的回答是基于官方 Django documentation
在 Django 中我有两个模型——用户和信息亭
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(_('username'), max_length=30, unique=True)
email = models.EmailField(_('email'), max_length=254, unique=True)
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=30, blank=True)
is_staff = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
role = models.CharField(
'User Role',
choices=ROLES,
default='agent',
max_length=15)
updated_on = models.DateTimeField('Updated on', auto_now=True)
timezone = TimeZoneField(default='America/Los_Angeles')
locations = models.ManyToManyField(Location, blank=True)
class Kiosk(models.Model):
'''Kiosk unit'''
name = models.CharField('Name', max_length=60)
enabled = models.BooleanField('Enabled', default=True)
created_on = models.DateTimeField('Created on', auto_now_add=True)
updated_on = models.DateTimeField('Updated on', auto_now=True)
last_check_in = models.DateTimeField('Last Time Checked In', null=True)
我需要在 Django Admin 中根据用户 (request.user.timezone) 中的 timezone
字段表示时间戳 created_on, updated_on, last_check_in
。
我想创建自定义 Widget
但在这种情况下我需要手动将它添加到每个时间戳字段,这听起来不对,尤其是考虑到我想在未来扩展的考虑添加更多带有时间戳的模型。
还有没有更多的pythonic解决方案? 谢谢!
要根据 request.user.timezone
应用您的自定义 Timezone
,需要:
- 在
app/middleware.py
中创建中间件
我基本上 运行 timezone.activate()
如果用户不是匿名的,并且时区是从当前用户模型中获得的
import pytz
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_anonymous:
tzname = request.user.timezone
timezone.activate(tzname)
else:
timezone.deactivate()
return self.get_response(request)
- 将其添加到
settings.py
中已安装的中间件
MIDDLEWARE = [
...
'app.middleware.TimezoneMiddleware'
]
在这个例子中,我使用了 pytz
外部 python 库。我的回答是基于官方 Django documentation