2015-10-18 63 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