В моем разделе администрирования 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)