backend/django

Django: custom list_filter in ModelAdmin

seul chan 2018. 4. 29. 08:30

Using list_filter in ModelAdmin, ordering follow model’s default ordering in Meta.

But if you want to have custom filter, you can add some filter inheriting SimpleListFilter

For exmple, it will automatically order by created_at (reversd, for -)

class MyModel(models.Model):
    class Meta:
        ordering = ['-created_at']

When you want to filter by status, you can add your own custom filter.

class StatusFilter(SimpleListFilter):
    title = _('status')
    parameter_name = 'status'

    def lookups(self, request, model_admin):
        queryset = model_admin.queryset(request)
        return [(i, i) for i in queryset.value_list('status', flat=True).distinct().order_by('status')]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(statu__exact=self.value())

class MyModelAdmin(ModelAdmin):
    list_filter = (StatusFilter,)