You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:09