如何在Django管理过滤面板中显示每个类别的项目数量?

8ulbf1ek  于 2023-06-07  发布在  Go
关注(0)|答案(3)|浏览(221)

在Django admin中,我如何直接在过滤器面板中为每个类别的过滤器添加项目数量(参见下面的模型)?

电流滤波器面板

所需过滤面板

型号

我正在通过languages字段过滤UserProfile表。这是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',)
n9vozmp4

n9vozmp41#

这应该可以工作:

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,)

如果您选择直接学习代码,我肯定会鼓励您更好地理解过滤器和查询集。

omhiaaxx

omhiaaxx2#

您可以通过扩展admin.SimpleListFilter来编写自己的过滤器,如list_filter文档中所述
一个继承自django.contrib.admin.SimpleListFilter的类,您需要它来提供title和parameter_name属性,并覆盖查找和查询集方法

nhn9ugyo

nhn9ugyo3#

Django 5.0将通过admin.ModelAdmin增加facet计数。
您只需在管理类中选择以下选项之一。

class MyModelAdmin(admin.ModelAdmin):
    show_facets = admin.ShowFacets.ALLOW  # default - when '_facets' in URL query string
    show_facets = admin.ShowFacets.ALWAYS # show always
    show_facets = admin.ShowFacets.NEVER  # always disabled
    ...

请参阅https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.show_facets

相关问题