django: Как настроить отображение формы ModelAdmin в зависимости от пользователя? - PullRequest
1 голос
/ 05 сентября 2010

У меня есть модель, которой управляет Django Admin. Как настроить отображение формы редактирования на основе текущего пользователя? Например, если кто-то, кроме суперпользователя, модифицирует модель, я хочу скрыть определенные поля.

Было бы замечательно, если бы я мог установить fields на основе request.user

Ответы [ 3 ]

2 голосов
/ 05 сентября 2010

Хакерский способ сделать это - переписать переменную list_display КАЖДЫЙ раз при вызове представления списка изменений:

class MyModelAdmin(admin.ModelAdmin)
    def changelist_view(self, request, extra_context=None):
        user = request.user
        if user.is_superuser:
            self.list_display = ['field1', 'field2']
        else:
            self.list_display = ['field1']
        return super(MyModelAdmin, self).changelist_view(request, extra_context=None)

Но каждый раз устанавливайте для переменной желаемое значение, поскольку тот же экземпляр администратора может быть вызван и для запросов, сделанных другими пользователями!

1 голос
/ 16 июня 2012

Интересным подходом для изменения формы редактирования является изменение только списка полей, доступных только для чтения.

Для этой цели используется только функция переопределения get_readonly_fields :

class MyModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        user = request.user
        if user.is_superuser:
            readonly = []
        else:
            readonly = ['field1']
        return readonly

Относительно list_display современный подход к его изменению заключается в переопределении get_list_display :

Исходное определение просто возвращает self.list_display:

class ModelAdmin:
    def get_list_display(self, request):
        """
        Return a sequence containing the fields to be displayed on the
        changelist.
        """
        return self.list_display

Так что вы можетепредоставить:

class MyModelAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        user = request.user
        if user.is_superuser:
            list_display = ['field1', 'field2']
        else:
            list_display = ['field1']
        return list_display
0 голосов
/ 21 сентября 2013

Я думаю, что менее ответный путь описан в этом ответе: https://stackoverflow.com/a/16115125/710394

def get_list_display(self, request):
    ...whatever logic you need here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...