كيف يمكنني عرض عدد العناصر لكل فئة في لوحة مرشح مشرفي Django؟

في مدير Django ، كيف يمكنني إضافة عدد العناصر لكل فئة من الفلاتر مباشرة في لوحة المرشحات (انظر أدناه)؟

لوحة التصفية الحالية

Current filter

لوحة المرشحات المطلوبة

Desired filter

<�القوي> نموذج </قوي>

أنا أقوم بتصفية جدول UserProfile الخاص بي بواسطة حقل لغات الخاص به. هذا حقل أطراف بأطراف في جدول لغة .

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

2 إجابة

You can write your own filter by extending the admin.SimpleListFilter as explained in list_filter documentation

فئة ترث من django.contrib.admin.SimpleListFilter ، والتي   تحتاج إلى توفير العنوان وسمات parameter_name إلى و   تجاوز عمليات البحث وأساليب المربعات

0
وأضاف

يجب أن يعمل هذا:

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

سأشجعك بالتأكيد على فهم الفلتر وكذلك Queryset بشكل أفضل ، إذا اخترت التقاط الرمز مباشرة.

0
وأضاف
هذا يعمل مثل السحر ، وذلك بفضل! كما يعمل مع المجالات ذات الصلة. ملحوظة: اضطررت إلى استخدام Count ('user') لأنني في حاجة إلى حساب حقل من نموذج UserProfile .
وأضاف المؤلف nbeuchat, مصدر