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

时间:2009-05-19 02:05:29

标签: django django-admin django-authentication

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

4 个答案:

答案 0 :(得分:12)

从版本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)

答案 1 :(得分:5)

请参阅Customizing an Admin form in Django while also using autodiscover

基本上,您可以使用所需的功能定义自定义的Admin类。

然后取消注册并注册修改后的Admin类。

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

答案 2 :(得分:4)

这是一个完整的例子,它继承自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)

答案 3 :(得分:0)

在更高版本的Django中,它的工作原理与您期望的完全一样:

list_filter = ('groups', )

无需注销/注册管理类。