模型.py
class Task(models.Model):
online = models.BooleanField(blank=False)
我想使用 django-filter 在表单中创建以下复选框:
[]在线 []物理
如果表单为空或两者都被勾选,则获取 Task.objects.all()。如果只勾选一个,则执行 Task.objects.filter('Online'=True/False)。
我尝试添加以下内容:
import django_filters
from app.models import Task
from django.db import models
class TaskFilter(django_filters.FilterSet):
online = django_filters.BooleanFilter(name='online', lookup_expr='isnull')
class Meta:
model = Task
fields = ['online']
filter_overrides = {
models.BooleanField: {
'filter_class': django_filters.BooleanFilter,
'extra': lambda f: {
'widget': forms.CheckboxInput,
},
},
}
我尝试了以下小部件:Select、RadioSelect、CheckboxInput,但似乎所有这些小部件的输出都相同。我得到一个下拉列表,例如
在线:[下拉菜单从是、否、未知中选择一个值]
请您参考如下方法:
您可以对此类内容使用选择:
TYPE_CHOICES = (
(0, 'Online'),
(1, 'Physical'),
)
class Task(models.Model):
type = models.CharField(
choices=TYPE_CHOICES, default=0, max_length=100
)
objects = TaskQuerySet().as_manager()
然后你可以像往常一样过滤它:
Task.objects.filter(type=0).filter(...)
为了使它更容易,您可以添加自定义查询集类:
class TaskQuerySet(models.QuerySet):
def get_online(self):
return self.filter(type=0)
def get_physical(self):
return self.filter(type=1)
这将允许您执行以下操作:
Task.objects.get_online.filter(...)
Task.objects.get_physical.filter(...)
在filters.py中添加:
type = django_filters.MultipleChoiceFilter(field_name='type', choices=CHOICES, widget=forms.CheckboxSelectMultiple)
