Несколько версий админки django для одной и той же модели - PullRequest
2 голосов
/ 29 сентября 2010

В моем разделе администрирования django я хотел бы показать разные версии страницы администратора в зависимости от того, какой пользователь вошел в систему. Я могу придумать несколько способов, как это может работать, но я не понял, как это сделать. сделать любой из них.

Возможно, я мог бы поместить логику в admin.ModelAdmin, чтобы посмотреть на текущего пользователя и динамически изменить поле «исключить». Это работает? Или, может быть, запустить различные пользовательские шаблоны в зависимости от того, кто вошел в систему, и попросить шаблоны включать / исключать поля в зависимости от ситуации.

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

Я мог бы взять пару виджетов, которые используются при рендеринге шаблонов страниц администратора, и включить их в мою собственную страницу, которая выполняет одну конкретную работу, которая необходима для работы мощных пользователей.

Я мог бы настроить несколько AdminSites и ограничить доступ к ним через систему url / view. Но тогда я не уверен, как зарегистрировать разные классы admin.ModelAdmin на разных сайтах AdminSite.

Любой совет по этому вопросу будет принят.

Ответ

Спасибо за подсказку. Вот как я это сделал ...

def get_form(self, request, obj=None, **kwargs):
    """This dynamically inserts the "owners" field into the exclude list
    if the current user is not superuser.
    """
    if not request.user.is_superuser:
        if self.exclude:
            self.exclude.append('owners')
        else:
            self.exclude = ['owners']
    else:
        # Necessary since Admin objects outlive requests
        try:
            self.exclude.remove('owners')
        except:
            pass


    return super(OwnersModelAdmin,self).get_form(request, obj=None, **kwargs)

1 Ответ

1 голос
/ 29 сентября 2010

В классе ModelAdmin предусмотрено немало хуков для такого рода вещей.

Одна из возможностей - переопределить метод get_form. Он принимает запрос, а также редактируемый объект, чтобы вы могли получить оттуда текущего пользователя и вернуть разные ModelForms, зависящие от пользователя.

Стоит посмотреть на источник для ModelAdmin - он находится в django.contrib.admin.options - чтобы увидеть, может ли переопределение этого или любого другого метода удовлетворить ваши потребности.

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