如何解决根据用户的时区显示Django Admin DateTimeField
在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'),blank=True)
last_name = models.CharField(_('last name'),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)
我需要相应地在User(request.user.timezone)中的created_on,updated_on,last_check_in
字段中代表Django Admin中的时间戳timezone
。
我曾考虑过创建自定义Widget
,但在这种情况下,我需要将其手动添加到每个时间戳字段中,这听起来不太正确,尤其是考虑到我将来要扩展的考虑因素带时间戳的模型。
是否还有其他pythonic解决方案? 谢谢!
解决方法
要基于Timezone
应用自定义request.user.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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。