1

我有date_fromdate_to和过滤器studentAstudentB

我希望能够一次使用其中一个、其中一些、全部或一个都不过滤数据。它们都不意味着呈现整个数据 - 没有应用过滤器。

说,我选择按日期范围过滤并提交。我会看到所选时期的数据。现在,如果我清除表单(日期范围过滤条件),整个数据应该会再次弹出 - 因为没有使用过滤器。

为了使这个工作我在我的定义条件views.py

if (    form.is_valid() 
    and len(request.GET['date_from']) > 0 
    and len(request.GET['date_to']) > 0
    ): 
    date_from = form.cleaned_data['date_from']
    date_to = form.cleaned_data['date_to']
    attendance = Students.objects.filter(
                        date__range=(date_from, date_to))

如果我没有这个条件,那么,当我从上面的步骤中清除过滤器时,不会弹出任何数据。

当我有一个或两个过滤器时,这不是问题,但是随着更多过滤器的出现,代码开始迅速增长——我必须做很多elif陈述,例如。

elif (    form.is_valid() 
    and len(request.GET['date_from']) > 0 
    and len(request.GET['date_to']) > 0
    and len(request.GET['studentA']) > 0
    ): 
    # apply this filter

elif (    form.is_valid() 
    and len(request.GET['studentA']) > 0
    ):
    # apply this one

等等。

我的问题是,是否有任何替代的、不那么冗长的方式来来回应用和删除过滤器(我确定有)?

4

1 回答 1

2

对于这种事情,我会使用 django-filter ( https://github.com/alex/django-filter )。它为您完成所有过滤。它只是给你一个Form你可以显示的。

编辑:

对于范围日期过滤器(开始和结束日期),您只需添加 2 个过滤器,一个用于lte查找,一个用于gte查找。例如:

date_start = django_filters.DateFilter(name='{date field to filter}' lookup_type='gte')
date_end = django_filters.DateFilter(name='{date field to filter}' lookup_type='lte')
于 2013-09-22T13:17:36.983 回答