【发布时间】:2011-01-17 18:00:11
【问题描述】:
我的管理员用户由教师类扩展/子类化。
如何防止教师查看和更改其他教师的个人资料数据,而教师只能更改自己的记录/行?提前致谢!
【问题讨论】:
标签: django django-models django-admin django-forms
我的管理员用户由教师类扩展/子类化。
如何防止教师查看和更改其他教师的个人资料数据,而教师只能更改自己的记录/行?提前致谢!
【问题讨论】:
标签: django django-models django-admin django-forms
目前没有简单的方法可以做到这一点,但object level permissions 即将在 Django 1.2 中推出 - 尽管您必须做一些工作才能使其在管理中工作。
幸运的是,有一个Django Advent article 解释了您需要做什么。
【讨论】:
可能没有内置方法可以做到这一点。
权限是按对象类型全局设置的,而不是按特定对象实例设置的。例如,可以说“玛丽可能会改变新闻报道”,但目前还不能说“玛丽可能会改变新闻报道,但只会改变她自己创作的新闻报道”或“玛丽可能只会改变具有特定状态的新闻报道” 、发布日期或 ID。”后一种功能是 Django 开发人员目前正在讨论的内容。
不过,object level permissions 显然要来了。
【讨论】:
我不确定我是否完全理解你想要做什么,但如果你的想法是让内置用户管理页面对教师用户的工作方式略有不同,那么我相信你只需要扩展 @ 987654322@,并覆盖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's permission framework 或覆盖has_add_permission 和has_delete_permission 方法来执行此操作。
如果您想了解更多信息,请查看ModelAdmin 源代码(contrib/admin/options.py)。
【讨论】: