【问题标题】:django-filter for Boolean布尔值的 django-filter
【发布时间】:2018-07-03 12:56:51
【问题描述】:

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

当我使用下面的代码时,get 方法会“打开”或“关闭”。怎么可能是“真”/“假”?

模型.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)

过滤器.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>

【问题讨论】:

    标签: django django-filter django-filters


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2014-05-11
      • 2017-05-15
      • 2012-01-09
      • 2020-12-30
      相关资源
      最近更新 更多