首页 > 解决方案 > django_filter 搜索栏的布尔字段

问题描述

我试图在搜索栏上显示一个选项,用户可以在其中为下面的布尔字段(和)选择一个TrueFalse值。lead_registerfinished_leveltest

class LevelTestFilter(django_filters.FilterSet):
    class Meta:
        model = LevelTest
        fields = {
            'first_name': ['icontains'],
            'username': ['icontains'],
            'phone_number': ['icontains'],
            'email': ['exact'],
            'lead_register': ['exact'],
            'finished_leveltest': ['exact'],
        }

现在,我输入了,exact因为我不知道该放什么。我希望你们能帮忙。非常感谢!

标签: djangofilterdjango-formsdjango-filterdjango-filters

解决方案


https://django-filter.readthedocs.io/en/master/guide/usage.html#overriding-default-filters

filter_overrides您可以通过添加以下内容来覆盖所有表单的布尔值Meta

class LevelTestFilter(django_filters.FilterSet):
    class Meta:
        model = LevelTest
        fields = {
            'first_name': ['icontains'],
            'username': ['icontains'],
            'phone_number': ['icontains'],
            'email': ['exact'],
            'lead_register': ['exact'],
            'finished_leveltest': ['exact'],
        }
        filter_overrides = {
            models.BooleanField: {
                'filter_class': django_filters.BooleanFilter,
                'extra': lambda f: {
                    'widget': forms.CheckboxInput,
                },
            },
        }

或者,您可以只自定义单个字段,如果您以一种或另一种方式修改其中的大部分,这将非常有用:

class LevelTestFilter(django_filters.FilterSet):
    lead_register__exact = django_filters.BooleanFilter(
        field_name='lead_register',
        label='A more expressive label',
        lookup_expr='exact',
        widget=forms.CheckboxInput,
    )
    ...

    class Meta:
        model = LevelTest
        fields = {
            'first_name': ['icontains'],
            'username': ['icontains'],
            'phone_number': ['icontains'],
            'email': ['exact'],
            'lead_register': ['exact'],
            'finished_leveltest': ['exact'],
        }

推荐阅读