2015-10-18 96 views
0

我有一个应用程序'app_name',它具有通过OneToOne字段方式链接到用户对象的配置文件对象。现在登录后,我使用他的个人资料对象ID将用户重定向到管理网站上的编辑个人资料页面。我已按预期授予了is_staff访问权限和编辑配置文件的权限。在django管理网站中向工作人员用户的网址拦截

现在我不想阻止他访问其他配置文件对象。我有两种方法,截至目前,我可以这么认为 - 1.制作一个自定义权限,只允许登录他的个人资料的编辑权限。 2.阻止不包含个人资料对象ID的网址。

超级用户应该能够正常访问,因为它是默认可用的。

我不知道如何执行其中一种方法。任何其他可能的方式太受欢迎。请帮忙!

回答

0

覆盖ModelAdmin.get_queryset()可以排除其他对象:

class ProfileAdmin(ModelAdmin): 
    # current user can only see his profile 
    def get_queryset(self, request): 
     qs = super(ProfileAdmin, self).get_queryset(request) 
     if not request.user.is_superuser: 
      qs = qs.filter(id=request.user.id) 
     return qs 

如果你只是想控制更改权限,覆盖ModelAdmin.has_change_permission()

class ProfileAdmin(ModelAdmin): 
    # current user can only edit his profile 
    def has_change_permission(self, request, obj=None): 
     # user has permission to edit a obj 
     if not obj or request.user.is_superuser: 
      return True 
     # user ONLY has permission to edit his obj 
     return request.user.id == obj.user.id 
+0

第一个不是为我工作。这几乎没有任何区别。第二种方法给出TypeError说法:“has_change_permission()最多需要2个参数(给出3个参数)” –

+0

对不起,在方法定义中遗漏了'self'。但是第一个应该可以工作,当任何不是超级用户的用户想要查看其他用户的配置文件时,404将会被提出。第二个,虽然可以控制更改权限,但所有用户都可以查看更改列表。 – JimmyYe