管理面板中的 django choicefield 过滤器

roc*_*rty 4 python django django-admin

默认情况下,django 管理员list_filter提供模型选择中可用的所有过滤器。但除了那些我还想要一个过滤器,我们可以说它是“无”过滤器。

class Mymodel:
    char choice field (choices=(('1', 'txt1', '2', 'txt2')), null=True)

class MymodelAdmin(admin.ModelAdmin):
    ...
    list_filter = [..., choice_field, ...]
    ...
Run Code Online (Sandbox Code Playgroud)

这将在管理面板中设置三个过滤器(右侧过滤器)All, 'txt1', 'txt2',. 正确的?如果没有从选择中分配值,我想要再添加一个过滤器“无”。

到目前为止我尝试过的..

class ChoiceFieldFilter(admin.filters.ChoicesFieldListFilter):

    def __init__(self, *args, **kwargs):
        super(ChoiceFieldFilter, self).__init__(*args, **kwargs)

        self.lookup_val = [('', 'None')]

    def queryset(self, request, queryset):
        print self.lookup_val
        print  self.field.flatchoices
        if self.lookup_val == '':
            return queryset.filter(choice_field='')
        else:
            return queryset.filter(choice_field=self.lookup_val)

    def choices(self, cl):
        pass
Run Code Online (Sandbox Code Playgroud)

然后在管理课上

list_filter = [..., ('choice_field', ChoiceFieldFilter), ...]
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我无法None在 django admin 中看到过滤器

小智 6

您不必创建自定义列表过滤器。只需使用 django 的 AllValuesFieldListFilter

from django.contrib.admin.filters import AllValuesFieldListFilter
...
list_filter = [..., ('choice_field', AllValuesFieldListFilter)]
...
Run Code Online (Sandbox Code Playgroud)