I'm using django-filter package and I have many boolean fields. Is there a way to filter only when field is True? And show all other posibilities?
For example if I have 3 fields: True, False, False... Render objects that have 1st field equal True but doesn't matter about de rest, don't consider it 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()
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')
When I enter to products/
for the first time, I only see products that has all boolean fields = False and I want to see ALL products.
You don't need all of that filter stuff. To filter models based on the value of a BooleanField all you need is
dangerous_products = Product.objects.filter(is_dangerous=True)
This will return a QuerySet of all model instances with is_dangerous
set to True
.
You can then pass this variable to your template and display the information like this
{% for product in dangerous_product %}
<!-- Put whatever way you want to display each product in here. EX:-->
<h1>{{ product.name }}</h1>
{% endfor %}
The above template will display the name of every product with is_dangerous
set to True
.
For effective boolean filtering, you have to use
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',]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With