【问题标题】:Django admin - change permissions listDjango 管理员 - 更改权限列表
【发布时间】:2011-09-29 04:33:01
【问题描述】:

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

【问题讨论】:

    标签: django django-admin django-permissions


    【解决方案1】:

    我从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']

    【讨论】:

      【解决方案2】:

      雷纳托的回答几乎是完美的。 Django 管理员使用相同的表单使添加用户成为一个两步过程,他的代码在第一步中失败并出现 KeyError for 'user_permissions'。

      修复很简单,只需使用以下代码即可:

      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
      

      【讨论】: