2010-09-29 4 views
2

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

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

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

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

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

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

Ответ

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

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

Есть немало перехватчика в ModelAdmin классе для такого рода вещи.

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

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

+0

Спасибо. Это помогло. Я включил свой код в вопрос выше для справки. – Leopd