【问题标题】:Django Admin - remove permissions from the list on Add/Edit Group pageDjango Admin - 从添加/编辑组页面的列表中删除权限
【发布时间】:2016-04-01 22:57:54
【问题描述】:

我正在使用 Django 1.8.1。这是我第一次自定义管理屏幕。

列表中默认有一些权限,例如 admin|entry log、auth|group 等。我想从列表中删除这些权限。在Django admin - change permissions list的帮助下,我能够从用户编辑屏幕上的列表中过滤掉这些权限

我的问题是添加/编辑组屏幕。在此屏幕上,这些权限仍然存在。以下是页面的屏幕截图。

如何从该列表中删除某些权限?

【问题讨论】:

    标签: python django permissions django-admin


    【解决方案1】:

    如您提供的link 中所述,您可以对组编辑页面中的权限列表执行相同操作,但您必须创建另一个从 GroupAdmin 扩展的管理员。

    它的代码如下所示:

    from django.contrib.auth.models import Group
    from django.contrib.auth.admin import GroupAdmin
    
    class MyGroupAdmin(GroupAdmin):
        def get_form(self, request, obj=None, **kwargs):
            # Get form from original GroupAdmin.
            form = super(MyGroupAdmin, self).get_form(request, obj, **kwargs)
            if 'permissions' in form.base_fields:
                permissions = form.base_fields['permissions']
                permissions.queryset = permissions.queryset.exclude(content_type__app_label__in=['admin', 'auth']) # Example
            return form
    

    【讨论】:

    • 我在上面尝试过,但在打开添加/编辑组屏幕时没有调用 get_form 方法
    【解决方案2】:

    我尝试通过扩展 GroupAdmin 类并覆盖 get_form 方法来做到这一点。但不幸的是,这对我不起作用。 get_form 方法根本没有被调用。不知道是什么原因。

    以下解决了我的问题:

    class MyGroupAdminForm(forms.ModelForm):
    
        class Meta:
            model = Group
            fields = ('name', 'permissions')
    
        permissions = forms.ModelMultipleChoiceField(
            Permission.objects.exclude(content_type__app_label__in=['auth','admin','sessions','users','contenttypes']),
            widget=admin.widgets.FilteredSelectMultiple(_('permissions'), False))
    
    class MyGroupAdmin(admin.ModelAdmin):
        form = MyGroupAdminForm
        search_fields = ('name',)
        ordering = ('name',)
    
    admin.site.unregister(Group)
    admin.site.register(Group, MyGroupAdmin)
    

    使用上面的代码,我成功地从添加/编辑组屏幕上的可用权限列表中删除了应用程序 [auth、admin、session、users、contenttypes] 的权限。

    【讨论】:

      【解决方案3】:

      这是 Django 1.10.1 的最新版本

      # coding: utf-8
      
      from django.contrib import admin
      from django.contrib.auth.models import Group, User
      from django.contrib.auth.admin import GroupAdmin, UserAdmin
      from django.utils.translation import ugettext_lazy as _
      
      
      class CustomUserAdmin(UserAdmin):
          fieldsets = (
              (None, {'fields': ('username', 'password')}),
              (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
              (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                             'groups',)}),
              (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
          )
      
      
      class CustomGroupAdmin(GroupAdmin):
          def formfield_for_manytomany(self, db_field, request=None, **kwargs):
              if db_field.name == 'permissions':
                  qs = kwargs.get('queryset', db_field.remote_field.model.objects)
                  qs = qs.exclude(codename__in=(
                      'add_permission',
                      'change_permission',
                      'delete_permission',
      
                      'add_contenttype',
                      'change_contenttype',
                      'delete_contenttype',
      
                      'add_session',
                      'delete_session',
                      'change_session',
      
                      'add_logentry',
                      'change_logentry',
                      'delete_logentry',
                  ))
                  # Avoid a major performance hit resolving permission names which
                  # triggers a content_type load:
                  kwargs['queryset'] = qs.select_related('content_type')
              return super(GroupAdmin, self).formfield_for_manytomany(
                  db_field, request=request, **kwargs)
      
      
      admin.site.unregister(User)
      admin.site.unregister(Group)
      admin.site.register(User, CustomUserAdmin)
      admin.site.register(Group, CustomGroupAdmin)
      

      此代码将删除组中无用的权限并删除用户中的权限字段,如果您不想要用户部分,只需删除相关代码即可。

      【讨论】:

        【解决方案4】:

        @Niraj Chapla 需要 @JRodDynamite 的解决方案在覆盖后取消注册和注册组。

        from django.contrib.auth.models import Group
        from django.contrib.auth.admin import GroupAdmin
        
        class MyGroupAdmin(GroupAdmin):
            def get_form(self, request, obj=None, **kwargs):
                # Get form from original GroupAdmin.
                form = super(MyGroupAdmin, self).get_form(request, obj, **kwargs)
                if 'permissions' in form.base_fields:
                    permissions = form.base_fields['permissions']
                    permissions.queryset = permissions.queryset.exclude(content_type__app_label__in=['admin', 'auth']) # Example
                return form
        
        
        ############ ADD THIS #############
        admin.site.unregister(Group)
        admin.site.register(Group, MyGroupAdmin)
        ###################################
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-18
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          • 2019-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多