Я не уверен, что точно понимаю, что вы пытаетесь сделать, но если вы думаете, что встроенные страницы администрирования пользователей работают немного по-другому для пользователей Учителя, то я считаю, что вам просто нужно расширить 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
).