[英]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=True
、 is_secret=True
or is_active=True
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.