使用Django-Filter为Boolean字段创建复选框筛选Task模型
Django-filter实现Task模型的在线/线下复选框过滤需求
我来帮你搞定这个django-filter的需求,按照你想要的逻辑,我们需要自定义两个复选框字段,然后重写过滤逻辑来实现对应的查询。
先明确你的核心需求:
- 表单为空或两个复选框都勾选时,返回所有Task记录
- 仅勾选「在线」时,筛选
online=True的记录 - 仅勾选「线下」时,筛选
online=False的记录
下面是完整的实现代码:
import django_filters from app.models import Task class TaskFilter(django_filters.FilterSet): # 自定义两个布尔复选框,分别对应在线和线下选项 is_online = django_filters.BooleanFilter(widget=django_filters.widgets.BooleanWidget(), label="在线") is_offline = django_filters.BooleanFilter(widget=django_filters.widgets.BooleanWidget(), label="线下") class Meta: model = Task fields = [] # 因为用自定义字段,这里留空不映射模型字段 def filter_queryset(self, queryset): # 获取表单提交的两个复选框状态 online_checked = self.data.get('is_online') == 'True' offline_checked = self.data.get('is_offline') == 'True' # 按需求逻辑处理查询集 if not online_checked and not offline_checked: # 无勾选状态,返回全部 return queryset.all() elif online_checked and offline_checked: # 两个都勾选,返回全部 return queryset.all() elif online_checked: # 仅勾选在线,筛选online=True的记录 return queryset.filter(online=True) elif offline_checked: # 仅勾选线下,筛选online=False的记录 return queryset.filter(online=False) # 兜底返回全部 return queryset.all()
代码关键点说明:
- 没有直接复用模型的
online字段,而是自定义了is_online和is_offline两个独立的布尔筛选字段,这样能在表单中生成两个分开的复选框 - 重写
filter_queryset方法,手动判断两个复选框的提交状态,完全贴合你要求的逻辑返回对应查询集 - Meta类的
fields设为空列表,避免自动映射模型字段,完全由自定义逻辑控制过滤
视图与模板使用示例
在视图中使用这个FilterSet和常规django-filter用法一致:
from django_filters.views import FilterView from app.models import Task from app.filters import TaskFilter class TaskListView(FilterView): model = Task filterset_class = TaskFilter template_name = 'task_list.html'
模板中渲染筛选表单(可直接用默认渲染或手动控制样式):
<form method="get"> {{ filter.form.is_online }} {{ filter.form.is_online.label_tag }} {{ filter.form.is_offline }} {{ filter.form.is_offline.label_tag }} <button type="submit">筛选</button> </form> <!-- 渲染筛选后的任务列表 --> {% for task in object_list %} <!-- 任务内容 --> {% endfor %}
这样就能完全实现你想要的筛选逻辑啦~
内容的提问来源于stack exchange,提问作者GRS
相关产品推荐
相关产品推荐

