【问题标题】:How to dynamically override list_filter fields in Django Admin?如何在 Django Admin 中动态覆盖 list_filter 字段?
【发布时间】:2020-05-21 17:13:00
【问题描述】:

我在list_filter 中有几个字段。我必须为list_filter 中的每个值创建一个通用的model.SimpleListFilter

我无法为每个 list_filter 创建单独的类。

最好的解决方案是这样的:

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

MyCustomFilter 中的 lookupsqueryset 方法被每个 list_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

【问题讨论】:

    标签: python django django-admin django-admin-filters


    【解决方案1】:

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

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

    【讨论】:

    • 这似乎是一个更好的解决方案。但最好的解决方案是这样的:class MyModelAdmin(CustomFilter): list_filter = ('client_name', 'case_received_date') CustomFilter 中的 lookupsqueryset 方法被每个 list_filter 字段调用。
    • 很高兴这有效 - 如果我帮助您解决了您的问题,您介意接受我的回答吗?谢谢!
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2018-03-05
    • 2013-05-15
    • 1970-01-01
    • 2012-10-18
    • 2021-09-03
    相关资源
    最近更新 更多