django-filter for Boolean

时间:2018-01-24 13:01:30

标签: django django-filter django-filters

我是Django的初学者,正在做一个学习项目,这是一个预订系统。任何人都可以推荐我一个开源的Django项目,我可以检查源代码的最佳实践。提前致谢

当我使用下面的代码时,get方法得到" on"或"关闭"。怎么可能"真" /"错误"?

Model.py

class Mymodel(models.Model):
    ...
    is_xxx_approved = models.BooleanField(default=False,blank=False,null=False)
    is_contracted_by_yy= models.BooleanField(default=False,blank=False,null=False)
    is_zz_approved = models.BooleanField(default=False,blank=False,null=False)

Filter.py

class MymodelFilter(django_filters.FilterSet):
    class Meta:
        model = Mymodel
        fields = ['is_xxx_approved', 'is_contracted_by_yy', 'is_zz_approved']
        exclude = [
            'name',
            'address',
            'phone',
            'email',]
        filter_overrides = {
            models.BooleanField: {
                'filter_class': django_filters.BooleanFilter,
                'extra': lambda f: {
                    'widget': forms.CheckboxInput,
                },
            },
        }

模板

<div class="filter_index">
    {% with field=filter.form.is_xxx_approved %}
        {{ field.label_tag }}
        {{ field }}
    {% endwith %}

</div>
<div class="filter_index">
    {% with field=filter.form.is_contracted_by_yy %}
        {{ field.label_tag }}
        {{ field }}
    {% endwith %}
</div>
<div class="filter_index">
    {% with field=filter.form.is_zz_approved %}
        {{ field.label_tag }}
        {{ field }}
    {% endwith %}
</div>

1 个答案:

答案 0 :(得分:1)

我被问到并不完全清楚,但我会说在使用过滤器时通常应该避免使用CheckboxInput。简而言之,他们总是评估为true / false,并且无法为过滤器字段提交空值。例如,如果您提交一个空表单,则可以有效地构造此查询集:

Mymodel.objects \
    .filter(is_xxx_approved=False) \
    .filter(is_contracted_by_yy=False) \
    .filter(is_zz_approved=False)

虽然您可能有理由期望构建此查询集:

Mymodel.objects.all()

同样,这特别是CheckboxInput的问题,并且无法表示空值。相反,您应该使用默认的Select窗口小部件,或切换到RadioSelect

此外,同时使用Meta.fieldsMeta.exclude选项也是多余的。我建议使用Meta.fields