我有教师类扩展/子类化的管理员用户。
如何防止教师查看和更改其他教师的个人资料数据,教师只能更改自己的记录/行?提前谢谢!
答案 0 :(得分:6)
我不确定我到底知道您要做什么,但如果您认为内置用户管理页面对教师用户的工作方式略有不同,那么我相信您只需要扩展{ {1}},并覆盖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
方法将使用{{1}返回的查询集获取要更改或删除对象的方法。
还需要进行一次调整,因为用于更改delete_view
中密码的视图不会使用与其他视图相同的系统来更改对象。只需在新课程中覆盖它:
queryset
之后,您只需要阻止教师添加新用户或删除他们自己的记录。使用默认django's permission framework或覆盖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)
...
方法来执行此操作。
如果您需要更多信息(has_add_permission
),请查看has_delete_permission
源代码。
答案 1 :(得分:3)
可能没有建立这样做的方法。
请参阅permission docs:
每个对象类型全局设置权限,而不是按特定对象实例设置。例如,可以说“玛丽可能会改变新闻报道”,但目前还不能说“玛丽可能会改变新闻报道,但只会改变自己创作的故事”或“玛丽只能改变具有某种地位的新闻报道” ,出版日期或身份证明。“后一种功能是Django开发人员目前正在讨论的内容。
然而,显然object level permissions即将来临。
答案 2 :(得分:1)
目前没有简单的方法可以做到这一点,但是object level permissions即将在Django 1.2中推出 - 尽管你必须做一些工作才能让它在管理中工作。
幸运的是,Django Advent article解释了你需要做什么。