jerrymouse
jerrymouse

Reputation: 17822

How to dynamically override list_filter fields in Django Admin?

I have several fields in list_filter. I have to create a generic model.SimpleListFilter that is called for every value in list_filter.

I cannot create individual class for every list_filter.

The best solution would be something like:

class MyModelAdmin(MyCustomFilter):
    list_filter = ('client_name', 'case_received_date')` 

The lookups and queryset method in MyCustomFilter gets called for each list_filter field.

# admin.py
class MyModelAdmin(admin.ModelAdmin):
    list_display = ('client_name','client_application_number')
    list_filter = ('client_name', 'case_received_date', MyCustomFilter)

class MyCustomFilter(admin.SimpleListFilter):    
    def lookups(self, request, model_admin):
        pass

    def queryset(self, request, queryset):
        # Apply the filter selected, if any
        pass

Upvotes: 1

Views: 1606

Answers (1)

YellowShark
YellowShark

Reputation: 2269

You can use a function to generate an infinite number of anonymous classes. Here's an update to your code:

class MyCustomFilter(admin.SimpleListFilter):
    def lookups(self, request, model_admin):
        pass

    def queryset(self, request, queryset):
        # Apply the filter selected, if any
        pass

def my_custom_filter_maker(field):
    class MyAnonymousCls(MyCustomFilter):
        title = field
        parameter_name = field

    return MyAnonymousCls

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('client_name','client_application_number')
    list_filter = ('client_name', 'case_received_date', 
        my_custom_filter_maker('field_name'),  my_custom_filter_maker('another_field'))

Upvotes: 4

Related Questions