Django admin - 更改权限列表

时间:2011-07-05 22:17:47

标签: django django-admin django-permissions

是否有可能在用户编辑页面中更改权限列表?我不想显示所有权限,例如管理员日志条目或auth组等。 如何修改主查询集以排除其中的一些?

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:4)

Renato的答案几乎是完美的。 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