根据用户的时区显示 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,需要:

  1. app/middleware.py
  2. 中创建中间件

我基本上 运行 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)
  1. 将其添加到 settings.py
  2. 中已安装的中间件
MIDDLEWARE = [
    ...
    'app.middleware.TimezoneMiddleware'
]

在这个例子中,我使用了 pytz 外部 python 库。我的回答是基于官方 Django documentation