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