You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改/移除django_filters中BooleanField过滤器的Unknown选项并添加HTML类

解决方案

1. 移除/修改下拉框的「Unknown」选项

出现「Unknown」是因为IPDReport的realization字段允许为空(blank=True, null=True),当关联的Realization不存在时,cash的值为None,Django Filter默认会把这个值显示为「Unknown」。解决核心是显式定义过滤器的选项,替换默认行为。

2. 给cash过滤器添加HTML class

无法直接在Meta类的fields中设置widget属性,必须把realization__cash从Meta.fields中移除,作为IpdFilters的类属性显式定义,同时指定widget的class属性。

修改后的完整代码

class IpdFilters(django_filters.FilterSet):
    patient__name=django_filters.CharFilter(widget=forms.TextInput(attrs={'class':'form-control'}), lookup_expr='icontains', label='Name')
    ctscan__rt_number=django_filters.CharFilter(widget=forms.TextInput(attrs={'class':'form-control'}), lookup_expr='icontains', label='RT Number')
    package__patient_type__patient_type=django_filters.CharFilter(widget=forms.TextInput(attrs={'class':'form-control'}), lookup_expr='icontains', label='Type of Patient')
    realization__amount_received__gt=django_filters.NumberFilter(widget=forms.NumberInput(attrs={'class':'form-control'}), field_name='realization__amount_received', lookup_expr='gt', label='Min. Amount Received')
    realization__amount_received__lt=django_filters.NumberFilter(widget=forms.NumberInput(attrs={'class':'form-control'}), field_name='realization__amount_received', lookup_expr='lt', label='Max. Amount Received')
    from_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'from_doa', 'class':'form-control'}), field_name='package__date_of_admission', label='From - Date of Admission ', lookup_expr='gte')
    to_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'to_doa', 'class':'form-control'}), field_name='package__date_of_admission', label='To - Date of Admission ', lookup_expr='lte')
    from_date_bill=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'from_bd', 'class':'form-control'}), field_name='realization__billing_month', label='From - Date of Billing ', lookup_expr='gte')
    to_date_bill=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'to_bd', 'class':'form-control'}), field_name='realization__billing_month', label='To - Date of Billing ', lookup_expr='lte')
    
    # 显式定义realization__cash过滤器,解决Unknown问题并添加class
    realization__cash = django_filters.ChoiceFilter(
        choices=[
            ('', '全部'),  # 可选:保留空选项,替换默认的Unknown
            (True, '现金支付'),
            (False, '非现金支付')
        ],
        widget=forms.Select(attrs={'class': 'form-control'}),
        label='支付方式',
        lookup_expr='exact'
    )
    
    class Meta:
        model=IpdReport
        fields=[
            # 移除原来的'realization__cash',因为已经显式定义
            'patient__name', 'ctscan__rt_number', 'package__patient_type__patient_type',
            'realization__amount_received__gt', 'realization__amount_received__lt',
            'from_date', 'to_date', 'from_date_bill', 'to_date_bill'
        ]

可选调整

  • 如果不想保留空选项(过滤时必须选择现金/非现金),直接删掉('', '全部')这一行即可,下拉框会默认显示第一个选项。
  • 如果想把「Unknown」改成「未设置」这类自定义文字,可以用NullBooleanFilter实现:
realization__cash = django_filters.NullBooleanFilter(
    widget=forms.Select(
        choices=[
            ('', '全部'),
            ('True', '现金支付'),
            ('False', '非现金支付'),
            ('None', '未设置')
        ],
        attrs={'class': 'form-control'}
    ),
    label='支付方式'
)

内容的提问来源于stack exchange,提问作者noob87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:50:32