Skip to main content
 首页 » 编程设计

python之Django-Filter:为 bool 字段创建复选框

2024年09月07日19Renyi-Fan

模型.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)