2011-07-05 269 views
7

用戶編輯頁面中是否有更改權限列表的權限?我不想顯示所有權限,例如管理日誌條目或授權組等。 如何修改主要查詢集以排除其中的一些內容?Django管理員 - 更改權限列表

回答

9

我從this topic得到了這個想法,這也回答了你的問題,但它不是很清楚。

您必須覆蓋用於可視化的UserAdmin表單中用戶權限的查詢集。

要做到這一點,最簡單的方法是創建UserAdmin的子類,並覆蓋get_form方法:

from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 

class MyUserAdmin(UserAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     # Get form from original UserAdmin. 
     form = super(MyUserAdmin, self).get_form(request, obj, **kwargs) 
     if 'user_permissions' in form.base_fields: 
      permissions = form.base_fields['user_permissions'] 
      permissions.queryset = permissions.queryset.filter(content_type__name='log entry') 
     return form 

你可以改變你的查詢集的過濾器對任何你想要的: 例子:

# Exclude admin and auth.  
permissions.queryset = permissions.queryset.exclude(content_type__app_label__in=['admin', 'auth']) 

# Only view permissions of desired models (Can be your models or Django's) 
permissions.queryset = permissions.queryset.filter(content_type__model__in=['blog', 'post', 'user', 'group']) 

您創建類之後,你有你的新創建的管理員來註冊用戶模式:

admin.site.unregister(User) # You must unregister first 
admin.site.register(User, MyUserAdmin) 

編輯: 我添加了來自Maik Hoepfel的評論,因爲此代碼在創建新用戶時使django崩潰。


你可以在你的組編輯頁面的權限列表相同,但你必須創建一個從GroupAdmin擴展另一個管理員,並更改form.base_fields['user_permissions']form.base_fields['permissions']

4

雷納託的回答幾乎是完美的。 Django Admin使用相同的表單向用戶添加了一個兩步過程,並且他的代碼在第一步中失敗,出現'user_permissions'的KeyError。

解決方法是很容易的,只需要使用下面的代碼來代替:

def get_form(self, request, obj=None, **kwargs): 
    form = super(MyUserAdmin, self).get_form(request, obj, **kwargs) 
    # adding a User via the Admin doesn't include the permissions at first 
    if 'user_permissions' in form.base_fields: 
     permissions = form.base_fields['user_permissions'] 
     permissions.queryset = permissions.queryset.filter(content_type__name='log entry') 
    return form