【发布时间】:2010-10-27 05:04:56
【问题描述】:
它可以让您按员工状态和超级用户状态进行过滤,但是组呢?
【问题讨论】:
标签: django django-admin django-authentication
它可以让您按员工状态和超级用户状态进行过滤,但是组呢?
【问题讨论】:
标签: django django-admin django-authentication
从 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)
【讨论】:
list_filter = ('groups',)
见Customizing an Admin form in Django while also using autodiscover
本质上,您定义了一个具有您想要的功能的自定义管理类。
然后注销并注册您修改后的 Admin 类。
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
【讨论】:
这是一个完整的示例,它继承自 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)
【讨论】:
在更高版本的 Django 中,它的工作方式完全符合您的预期:
list_filter = ('groups', )
无需注销/注册管理类。
【讨论】:
django.contrib.auth 获得用户可自定义的 admin.py,因此在您的自定义用户模型的 admin.py 中进行此覆盖是一个好地方。