Администратор Django показывает неверный list_display в списке изменений - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь отобразить разные поля для разных пользователей в представлении списка администратора 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, даже если разрешения для этого суперпользователя не установлены явно (напрямую или через группу)

1 Ответ

1 голос
/ 09 апреля 2019

Это потому, что Django смотрит на класс list_display, а не на экземпляр list_display.Для динамического отображения списка, переписать ModelAdmin.get_list_display
https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_list_display

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...