在 Django admin 中,如何按组过滤用户?

Posted

技术标签:

【中文标题】在 Django admin 中,如何按组过滤用户?【英文标题】:In Django admin, how to filter users by group? 【发布时间】:2010-10-27 05:04:56 【问题描述】:

它可以让您按员工状态和超级用户状态进行过滤,但是组呢?

【问题讨论】:

【参考方案1】:

从 1.3 版开始可以做到using this:

list_filter = ('groups__name')

当然,正如@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)

【讨论】:

很好,谢谢!但是它显示为“按名称”后跟组列表,这有点令人困惑,如果显示“按组”会更好 我同意@thnee。可以这样实现list_filter = ('groups',)【参考方案2】:

见Customizing an Admin form in Django while also using autodiscover

本质上,您定义了一个具有您想要的功能的自定义管理类。

然后注销并注册您修改后的 Admin 类。

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

【讨论】:

【参考方案3】:

这是一个完整的示例,它继承自 SimpleListFilter,它在 Django 1.4 及更高版本中可用。

https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

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

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

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)

【讨论】:

【参考方案4】:

在更高版本的 Django 中,它的工作方式完全符合您的预期:

list_filter = ('groups', )

无需注销/注册管理类。

【讨论】:

我可以把它放在哪里? 在包含您的用户模型的应用程序的 admin.py 中。 但是您没有为 django.contrib.auth 获得用户可自定义的 admin.py,因此在您的自定义用户模型的 admin.py 中进行此覆盖是一个好地方。 我没有自定义用户模型。 啊!在这种情况下,您可以使用上面的注销/注册技术在任何模型中执行此操作。我只是推荐你的 User 模型,因为我假设你有一个,但 Django 实际上并不关心你在哪里做。

以上是关于在 Django admin 中,如何按组过滤用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin 的 changelist_view 中过滤查询集?

Django admin 根据权限过滤行

Django Admin:获取根据 GET 字符串过滤的 QuerySet,与更改列表中看到的完全一样?

如何在Django Admin中过滤foreignkey字段的查询集

在 Django Admin 中过滤多对多框

Django Admin:如何过滤特定范围值的整数字段