Я пытаюсь отобразить разные поля для разных пользователей в представлении списка администратора Django (я думаю, это называется changelist). Django показывает правильный набор полей для не суперпользователя, но переключается между наборами полей для суперпользователя.
У меня есть суперпользователь и не суперпользователь с пользовательским разрешением perm1
для модели, определенной в some_app
. Разрешение устанавливается для не суперпользователя через группу.
Ниже приведен код, который я использую для переключения list_display
в зависимости от пользователя.
def changelist_view(self, request, **kwargs):
user = request.user
if user.has_perm('some_app.perm1'):
self.list_display = (
'field1',
'field2',
)
make_log('non-super user')
else:
self.list_display = (
'field1',
'field2',
'field3',
'field4',
)
make_log('superuser')
return super(CustomAdmin, self).changelist_view(request, **kwargs)
Я пробовал с и без list_display
в определении класса. Без разницы.
Django правильно выводит журналы (make_log()
) в зависимости от того, кто обращается к этому представлению. Но почти половину времени Django показывает суперпользователю набор полей, предназначенных для не суперпользователя. И он всегда показывает правильный набор полей для пользователя с разрешением perm1
.
Я также пытался использовать if not user.is_superuser and user.has_perm('some_app.perm1')
в качестве условия также без разницы. Я думаю, суперпользователь может делать все, что хочет, но у него нет разрешений в соответствии с Django.
Что я делаю не так?
ОБНОВЛЕНИЕ (спасибо @ dirkgroten ):
Предположение, что суперпользователь не имеет разрешения, неверно в том смысле, что some_superuser.has_perm('some_app.perm1')
возвращает True
, даже если разрешения для этого суперпользователя не установлены явно (напрямую или через группу)