Как запретить Django Admin Users изменять данные профиля других Admin Admin? - PullRequest
4 голосов
/ 17 февраля 2010

У меня есть пользователь Admin, расширенный / разделенный на класс учителя.

Как запретить учителям просматривать и изменять данные профиля других учителей, а учителя могут изменять только свои собственные записи / строки? Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 17 февраля 2010

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

class TeacherSpecificUserAdmin(UserAdmin):
  def queryset(self, request):
    if request.user.is_teacher():
      return Teacher.objects.filter(pk=request.user.pk)
    return UserAdmin.queryset(self, request)

Это позволит запретить Учителям редактировать или удалять другие записи, потому что, если вы посмотрите в коде ModelAdmin, методы change_view и delete_view используют набор запросов, возвращенный из метода queryset, чтобы получить объект для изменить или удалить.

Необходим еще один твик, потому что представление, используемое для изменения пароля в UserAdmin, не использует ту же систему, что и другие представления, для изменения объекта. Просто переопределите это в вашем новом классе:

...
def user_change_password(self, request, id):
  if request.user.is_teacher() and request.user.pk != int(id):
    # PermissionDenied is in django.core.exceptions
    raise PermissionDenied
  return UserAdmin.user_change_password(self, request, id)
...

После этого вам просто нужно запретить учителям добавлять новых пользователей или удалять их собственные записи. Сделайте это либо с помощью стандартной структуры прав доступа django , либо переопределив методы has_add_permission и has_delete_permission.

Загляните в исходный код ModelAdmin, если вам нужна дополнительная информация (в contrib/admin/options.py).

3 голосов
/ 17 февраля 2010

Вероятно, для этого нет сборки.

См. разрешения документов :

Разрешения устанавливаются глобально для каждого типа объекта, а не для конкретного экземпляра объекта. Например, можно сказать «Мэри может менять новости», но в настоящее время невозможно сказать «Мэри может изменять новости, но только те, которые она сама создала» или «Мэри может изменять только новости, которые имеют определенный статус , дата публикации или ID. " Последняя функциональность - это то, что разработчики Django в настоящее время обсуждают.

Однако разрешения на уровне объекта , очевидно, приходят.

1 голос
/ 17 февраля 2010

В настоящее время нет простого способа сделать это, но разрешения на уровне объекта скоро появятся в Django 1.2 - хотя вам нужно проделать некоторую работу, чтобы заставить его работать в админке.

К счастью, есть статья Advent Django , которая объясняет, что вам нужно делать.

...