Membuat Custom Filter di Django Admin

Secara default, django sudah menyertakan filter untuk field-field yang ada di Model, misal, kita punya field berikut:
is_published = models.BooleanField(default=True)

maka, secara otomatis, django admin akan membuat filter Is Published dengan nilai All, True, False.

Tergantung kebutuhan, kadang dibutuhkan juga custom filter, misal untuk menghitung berapa jumlah Image di masing-masing Post, di mana Post dan Image memiliki model relasi One-To-Many. Caranya adalah sebagai berikut:
Langkah-langkahnya adalah sebagai berikut:

Membuat class turunan dari admin.SimpleListFilter.

class NumberOfImagesFilter(admin.SimpleListFilter):
    """Filter based on numbers of images.
    == 7
    > 7
    < 7
    """
    title = _('Number of Images')
    parameter_name = 'imgcount'

    def lookups(self, request, model_admin):
        return (
            ('7', _('7')),
            ('lebihdari7', _('Lebih dari 7')),
            ('kurangdari7', _('Kurang dari 7')),
        )

    def queryset(self, request, queryset):
        if self.value() == '7':
            return queryset.annotate(num_images=Count('image')).filter(num_images=7)
        elif self.value() == 'lebihdari7':
            return queryset.annotate(num_images=Count('image')).filter(num_images__gt=7)
        elif self.value() == 'kurangdari7':
            return queryset.annotate(num_images=Count('image')).filter(num_images__lt=7)

Langkah selanjutnya adalah menambahkan di Model parent, dalam hal ini Post

class PostAdmin(admin.ModelAdmin):
    list_filter = (NumberOfImagesFilter,)

Jika tidak ada error, maka Anda dapat melihat filter baru di sebelah kanan list display Post berjudul Number of Images.

Comments

Popular posts from this blog

Adding Image Alternate Text into WordPress Image Attachment using python-wordpress-xmlrpc Library

Keutamaan Tidur yang Sedikit Menurut para Ulama

Kisah Nabi Uzair a.s.