django_filters filter_overrides不应用于带choices的CharField

w41d8nur  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(98)

我已经用一个 meta类声明了一个django_filters.FilterSet,我想在其中使用filter_overrides来自定义一些过滤器。我使用的代码与官方文档中的示例非常相似:

class AccommodationFilter(django_filters.FilterSet):
    class Meta:
        model = AccommodationOffer
        fields = ['numberOfPeople', 'petsAllowed', 'typeOfResidence', 'startDateAccommodation' ]
        filter_overrides = {
            models.BooleanField: {
                'filter_class': django_filters.BooleanFilter,
                'extra': lambda f: {
                    'widget': forms.CheckboxInput(attrs={'class':'form-control', 'value' : 'true'}),
                },
            },
            models.CharField: {
                'filter_class': django_filters.ChoiceFilter,
                'extra': lambda f: {
                    'widget': forms.Select(attrs={'class':'form-control'}),
                },
            },
        }

BooleanFields按预期显示,但是无论我如何尝试,CharFields(设置了选项)都不会使用class=“form-control”属性呈现。

ut6juiuv

ut6juiuv1#

正如每个评论所提到的,这是django_filters中的一个bug。只要this issue没有得到解决,就必须修改django_filters代码。
如果有人遇到同样的问题,这是我提出的解决方案:

class MyFilterSet(django_filters.FilterSet):

    [...]
    
    def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
        super().__init__(data, queryset, request=request, prefix=prefix)
        for f in self.filters.values():
            if isinstance(f, django_filters.ChoiceFilter):
                    f.extra.update({'widget': forms.Select(attrs={'class' : 'form-control'})})

相关问题