Membuat Custom Filter di Django Admin
Secara default, django sudah menyertakan filter untuk field-field yang ada di Model, misal, kita punya field berikut:
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:
Jika tidak ada error, maka Anda dapat melihat filter baru di sebelah kanan list display Post berjudul Number of Images.
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
Post a Comment