首页 > 解决方案 > 如何在 Django Admin 中动态覆盖 list_filter 字段?

问题描述

我有几个领域list_filter。我必须创建一个model.SimpleListFilterlist_filter.

我不能为每个 list_filter 创建单独的类。

最好的解决方案是:

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

为每个字段调用lookupsandqueryset方法。MyCustomFilterlist_filter

# 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

标签: pythondjangodjango-admindjango-admin-filters

解决方案


您可以使用函数来生成无限数量的匿名类。这是您的代码的更新:

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'))

推荐阅读