Django过滤器|布尔字段

时间:2017-12-27 15:02:26

标签: python django django-filter

我使用的是django-filter包,我有很多布尔字段。 有没有办法只在字段为True时进行过滤?并显示所有其他可能性?

例如,如果我有3个字段:True,False,False ...渲染第一个字段等于True的对象,但对于de rest并不重要,不要认为它是假的。

model.py

class Product(models.Model):
    name = models.CharField(max_length=15)
    is_dangerous = models.BooleanField()
    is_secret = models.BooleanField()
    is_active = models.BooleanField()

filters.py

class SearchFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    class Meta:
        model = Product
        fields = ['name', 'is_dangerous', 'is_secret', 'is_active',]
        filter_overrides = {
            models.BooleanField: {
                'filter_class': django_filters.BooleanFilter,
                'extra': lambda f: {
                    'widget': forms.CheckboxInput,
                },
            },
        }

urls.py

url(r'^products/$', views.products, name='products')

当我第一次进入products/时,我只看到所有布尔字段= False的产品,我希望看到所有产品。

3 个答案:

答案 0 :(得分:1)

您不需要所有过滤器。要根据BooleanField的值过滤模型,只需

dangerous_products = Product.objects.filter(is_dangerous=True)

这将返回is_dangerous设置为True的所有模型实例的QuerySet。

然后,您可以将此变量传递给模板并显示如下信息

{% for product in dangerous_product %}
    <!-- Put whatever way you want to display each product in here. EX:-->
    <h1>{{ product.name }}</h1>
{% endfor %}

上述模板会显示is_dangerous设置为True的每件商品的名称。

答案 1 :(得分:0)

您不应该使用CheckboxInput,因为小部件无法区分&#34;不存在&#34;和&#34;假&#34;。只需删除过滤器覆盖并使用默认的选择小部件。

答案 2 :(得分:0)

要进行有效的布尔过滤,您必须使用

from django_filters import rest_framework as filters 
class SearchFilter(filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    class Meta:
        model = Product
        fields = ['name', 'is_dangerous', 'is_secret', 'is_active',]