В администраторе Django, как фильтровать пользователей по группам?

Это дает вам фильтр по статусу персонала и статусу суперпользователя, но как насчет групп?


person rick    schedule 19.05.2009    source источник


Ответы (4)


Начиная с версии 1.3 это можно сделать с помощью это:

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)
person Francisco Puga    schedule 22.10.2011
comment
Хорошо, спасибо! Но он отображается как «По имени», за которым следует список групп, что немного сбивает с толку, было бы лучше, если бы он сказал «По группе». - person thnee; 13.04.2013
comment
Я согласен с @thnee. Этого можно добиться вот так list_filter = ('groups',) - person laltin; 07.12.2015


Вот полный пример, который наследуется от 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)
person thnee    schedule 13.04.2013

В более поздних версиях Django он работает именно так, как вы ожидаете:

list_filter = ('groups', )

Нет необходимости отменять регистрацию/регистрацию класса администратора.

person shacker    schedule 25.10.2018
comment
И куда я могу это положить? - person Adam Barnes; 23.05.2019
comment
В admin.py для приложения, которое содержит вашу модель пользователя. - person shacker; 25.05.2019
comment
Но у вас нет настраиваемого пользователем admin.py для django.contrib.auth, поэтому хорошее место для этого переопределения — admin.py пользовательской модели пользователя. - person shacker; 28.05.2019
comment
У меня нет есть пользовательской модели пользователя. - person Adam Barnes; 28.05.2019
comment
Ах! В этом случае вы можете сделать это в любой из ваших моделей, используя описанные выше методы отмены регистрации/регистрации. Я рекомендовал вашу модель пользователя только потому, что предполагал, что она у вас есть, но Django на самом деле все равно, где вы это делаете. - person shacker; 30.05.2019