【问题标题】:Aplying and removing filters django应用和删除过滤器 django
【发布时间】:2013-09-27 11:03:12
【问题描述】:

我有date_fromdate_tostudentAstudentB 过滤器。

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

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

为了使这项工作我在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

等等。

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

【问题讨论】:

    标签: django forms filter


    【解决方案1】:

    我会使用 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')
    

    【讨论】:

    • 我已经使用了一段时间,但据我所知,它不支持自定义日期的日期范围过滤器,这对我来说是必不可少的。无论如何感谢您的意见。
    • 它确实有一个DateRangeFilter,但它是带有“本周”、“本月”等选项的下拉列表。如果您想要一个具有一个开始日期和另一个结束日期的范围过滤器日期过滤器,您可以添加 2 个日期过滤器。 (查看更新的答案)
    • 你拯救了我的一天 :) 我会修改它并回来接受你的回答。谢谢!
    • 请采纳@jproffitt 的建议。扩展您的过滤器或扩展表单,但绝对不要在视图中添加额外的逻辑。
    • 没问题。有机会我会调查的。
    猜你喜欢
    • 2014-07-08
    • 2013-04-14
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多