Как я могу отобразить количество элементов в категории на панели фильтра администратора Django? - PullRequest
0 голосов
/ 25 апреля 2018

В админке Django, как я могу добавить количество элементов для каждой категории фильтра прямо на панели фильтров (см. Макет ниже)?

Панель текущего фильтра

Current filter

Панель требуемого фильтра

Desired filter

Модель

Я фильтрую свою таблицу UserProfile по ее полю languages.Это поле «многие ко многим» в таблице Language.

class UserProfile(models.Model):
    # ...
    languages = models.ManyToManyField(Language, blank=True)

class Language(models.Model):
    name = models.CharField(max_length=64)
    # ...

Моя текущая конфигурация администратора:

@admin.register(UserProfile):
class UserProfileAdmin(admin.ModelAdmin):
    # ...
    list_filter = ('languages',)

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Это должно работать:

class UserProfileLanguageFilter(admin.SimpleListFilter):
    title = _('Language')
    parameter_name = 'languages'

    def lookups(self, request, model_admin):
        qs = model_admin.get_queryset(request)
        # Return a list of (id, name) for lookups. We return the language_id and the string format "Language Name (Count of Users)" as the name.
        return [(i, "{}({})".format(j, k)) for i, j, k in
                qs.values_list('languages__id', 'languages__name').annotate(
                    user_count=Count('userprofile')).distinct().order_by(
                    'languages__name')]

    def queryset(self, request, queryset):
        if self.value():  # Use the lookup id we sent above; to filter
            return queryset.filter(languages__id=self.value())


@admin.register(UserProfile):
class UserProfileAdmin(admin.ModelAdmin):
    # ...
    list_filter = (UserProfileLanguageFilter,)

Я бы определенно рекомендовал вам лучше понять Фильтр, а также набор запросов, если вы решите подобрать код напрямую.

0 голосов
/ 25 апреля 2018

Вы можете написать свой собственный фильтр, расширив admin.SimpleListFilter, как описано в list_filter документации

класс, унаследованный от django.contrib.admin.SimpleListFilter, который вам нуженпредоставить атрибуты title и имя_параметра и переопределить методы поиска и набора запросов

...