自定义 django_filters 中 BooleanWidget 的选择

HBM*_*MCS 2 django django-views django-filter

我正在使用 django_filters。对于布尔字段,它会生成以下 HTML:

<select name="bass" id="id_bass">
  <option value="">Unknown</option>
  <option value="true" selected="">Yes</option>
  <option value="false">No</option>

</select>
Run Code Online (Sandbox Code Playgroud)

这源自Django 自己的 NullFields 细节。我怎样才能将那个丑陋的“未知”更改为其他内容?用户并不是真正在搜索“未知”;他们正在搜索“全部”,因为我的布尔字段是必需的,并且要么是trueor false

该小部件不接受choices属性。

我自己手动创建 HTML 部分解决了这个问题;尽管如此,我会从 中实现这一点,并且仅在模板上view使用。{{form}}

聚苯乙烯

在模板上执行此操作的最佳方法是在 DOM 加载后运行此 JavaScript:

    document.getElementById('id_bass').options[0].innerText = "---------";
Run Code Online (Sandbox Code Playgroud)

有点老套;尽管如此,它还是达到了我想要的效果。

JPG*_*JPG 5

您可以为此创建一个自定义小部件,并可以在您的BooleanFilter()as 中使用它,

from django_filters.widgets import BooleanWidget
from django.utils.translation import gettext as _


class CustomBooleanWidget(BooleanWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.choices = (("", _("Anything else")), ("true", _("Yes")), ("false", _("No")))


class YourFilterSet(filters.FilterSet):
    your_field = filters.BooleanFilter(widget=CustomBooleanWidget)

    class Meta:
        model = YourModelClass
        fields = ("your_field",)
Run Code Online (Sandbox Code Playgroud)