如何防止Django Admin用户更改其他管理员用户的个人资料数据?

Vie*_*iet 4 django django-models django-forms django-admin

我有管理员用户由Teacher类扩展/子类.

如何防止教师查看和更改其他教师的个人资料数据,教师只能更改自己的记录/行?提前致谢!

Clé*_*ent 7

我不确定我到底知道你要做什么,但如果您认为内置的用户管理页面对教师用户的工作方式略有不同,那么我相信您只需要扩展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)
Run Code Online (Sandbox Code Playgroud)

这将照顾禁止教师编辑或删除其他记录,因为如果你查看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)
...
Run Code Online (Sandbox Code Playgroud)

之后,您只需要阻止教师添加新用户或删除他们自己的记录.使用默认的django权限框架,或通过覆盖has_add_permissionhas_delete_permission方法来执行此操作.

ModelAdmin如果您想要更多信息(in contrib/admin/options.py),请查看源代码.