2010-02-17 36 views

回答

6

我不知道我知道你想要做什么,但如果是在你的心中是有内置的教师用户略有不同工作的用户管理页面,那么我相信你必须要延长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_viewdelete_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) 
... 

之后,您只需阻止教师添加新用户或删除他们自己的记录。做,要么使用默认​​,或通过重写has_add_permissionhas_delete_permission方法。

看看ModelAdmin的源代码,如果你想要更多的信息(在contrib/admin/options.py)。

+0

+1 Thanks Clement!我试图了解user_change_password()。阅读代码真的很值得。 – Viet 2010-02-18 12:16:19

3

有可能是没有办法做到这一点的生成。

permission docs

权限每对象类型的全局设置,而不是每个特定对象实例。例如,它可以说“玛丽可以修改的新闻故事,”但它不是目前可以说“玛丽可以修改的新闻故事,但只有那些她创造自己”或者“玛丽只能改变有一定的地位新闻报道,出版日期或ID。“后者的功能是Django开发人员目前正在讨论的内容。

但是,显然,object level permissions即将到来。

相关问题