如何修改/移除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
相关产品推荐
相关产品推荐

