2011-07-05 224 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