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.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s