在Django admin中,如何按组筛选用户?

在Django admin中,如何按组筛选用户?,django,django-admin,django-authentication,Django,Django Admin,Django Authentication,它提供了按员工状态和超级用户状态进行筛选的功能,但组又如何呢?请参见 本质上,您可以使用所需的功能定义一个定制的管理类 然后注销并注册修改后的管理员类 admin.site.unregister(User) admin.site.register(User, MyUserAdmin) 从版本1.3开始,可以执行以下操作: 当然,正如@S.Lott所解释的,您必须在admin.py文件中注册自定义类: from django.contrib import admin from django.co

它提供了按员工状态和超级用户状态进行筛选的功能,但组又如何呢?

请参见

本质上,您可以使用所需的功能定义一个定制的管理类

然后注销并注册修改后的管理员类

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

从版本1.3开始,可以执行以下操作:

当然,正如@S.Lott所解释的,您必须在admin.py文件中注册自定义类:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    list_filter = UserAdmin.list_filter + ('groups__name',)

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

下面是一个完整的示例,它继承了Django 1.4及更高版本中提供的SimpleListFilter

它支持设置所有可用的标签和参数,以创建完全自定义的过滤器

它在过滤器面板中显示为“按组”,并包含所有可用组的列表

from django.contrib.admin import SimpleListFilter
from django.contrib.auth.models import Group
from django.utils.translation import ugettext as _

class GroupListFilter(SimpleListFilter):
    title = _('group')
    parameter_name = 'group'

    def lookups(self, request, model_admin):
        items = ()
        for group in Group.objects.all():
            items += ((str(group.id), str(group.name),),)
        return items

    def queryset(self, request, queryset):
        group_id = request.GET.get(self.parameter_name, None)
        if group_id:
            return queryset.filter(groups=group_id)
        return queryset

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    list_filter = UserAdmin.list_filter + (GroupListFilter,)

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

在Django的更高版本中,它的工作原理与您预期的完全相同:

list_filter = ('groups', )

无需注销/注册admin类

很好,谢谢!但它显示为“按名称”,然后是组列表,这有点混乱,如果它说“按组”我同意@thnee,那就更好了。它可以像这样实现
list\u filter=('groups',)
,我可以把它放在哪里呢?对于包含您的用户模型的应用程序,在admin.py中。但是对于
django.contrib.auth
,您没有一个用户可自定义的admin.py。因此,在自定义用户模型的admin.py中可以进行覆盖。我没有自定义用户模型。啊!在这种情况下,您可以在您的任何模型中使用上面的取消注册/注册技术来完成。我只是推荐你的用户模型,因为我假设你有一个,但Django实际上并不在乎你在哪里做。
list_filter = ('groups', )