2013-09-22 107 views
1

我有date_from,date_to,studentAstudentB過濾器。附加和刪除過濾器django

我希望能夠使用其中的一個,其中一些,全部或一次過濾數據。沒有一個意味着整個數據呈現 - 沒有應用過濾器。

說,我選擇按日期範圍過濾並提交。我會收到選定期間的數據。現在,如果我清除表單(日期範圍過濾條件),則整個數據應該再次彈出 - 因爲沒有使用過濾器。

爲了使這一工作,我定義的條件在我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 

等等。

我的問題是,是否有任何替代方法,不太詳細的方式來回應用和刪除過濾器(我確定有)?

回答

2

我會使用django過濾器(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') 
+0

我已經使用了一段時間,但據我所知,它不支持帶自定義日期的日期範圍過濾器,這對我來說是必不可少的。無論如何感謝您的輸入。 – nutship

+0

它確實有一個'DateRangeFilter',但它下拉有諸如「This week」,「this month」等選項。如果你想要一個帶有一個開始日期和另一個結束日期過濾器的範圍過濾器,你可以添加2日期過濾器。 (查看更新後的答案) – jproffitt

+0

您節省了我的一天:)我會修補它並回來接受您的答案。謝謝! – nutship