簡體   English   中英

Django 過濾器 | Boolean 字段

[英]Django-filter | Boolean fields

我正在使用 django-filter package 並且我有很多 boolean 字段。 有沒有辦法只在 field 為 True 時進行過濾? 並展示所有其他可能性?

例如,如果我有 3 個字段:True、False、False ... 渲染第一個字段等於 True 但與 rest 無關的對象,不要認為它是 False。

model.py

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

過濾器.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,
                },
            },
        }

網址.py

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

當我第一次進入products/時,我只看到所有 boolean 字段 = False 的產品,我想查看所有產品。

你不需要所有這些過濾器的東西。 要根據 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的每個產品的名稱。

您不應該使用CheckboxInput s,因為小部件無法區分“不存在”和“假”。 只需刪除過濾器覆蓋並使用默認的選擇小部件。

為了有效的布爾過濾,你必須使用

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',]

添加參數method

您可以像這樣在每個屬性中添加method參數:

class SearchFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    is_dangerous = django_filters.BooleanFilter(
        widget=CheckboxInput(),
        method='unchecked_means_any_value',
    )
    is_secret = django_filters.BooleanFilter(
        widget=CheckboxInput(),
        method='unchecked_means_any_value',
    )
    is_active = django_filters.BooleanFilter(
        widget=CheckboxInput(),
        method='unchecked_means_any_value',
    )

    def unchecked_means_any_value(self, queryset, name, value):
        if not value:
            return queryset
        return queryset.filter(**{name: value})

如果value False ,它將返回原始的 QuerySet。 否則,它將使用以下名稱和值過濾查詢集: is_dangerous=Trueis_secret=True or is_active=True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM