是否有可能更改用户编辑页面中的权限列表?我不想不显示所有的权限,例如管理日志条目或认证组等。如何修改主查询集以排除其中的一些?
我从这个话题中得到了这个想法,它也回答了你的问题,但不是那么清楚。
您必须覆盖用于可视化的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'])
创建类之后,必须将User模型注册到新创建的Admin:
admin.site.unregister(User) # You must unregister first
admin.site.register(User, MyUserAdmin)
编辑:我添加了Maik Hoepfel的注释,因为这段代码在创建新用户时使django崩溃。
你可以在你的组编辑页面做同样的权限列表,但你必须创建一个从GroupAdmin扩展的另一个Admin,并将form.base_fields['user_permissions']
更改为form.base_fields['permissions']
Renato的答案几乎是完美的。Django管理员使用相同的表单将添加用户分为两步,他的代码在第一步中出现了'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