2013-09-22 4 views
1

У меня есть date_from, date_to, studentA и studentB фильтры.Фильтры для удаления и удаления 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-filter (https://github.com/alex/django-filter) для такого рода вещей. Он выполняет всю фильтрацию для вас. Он просто дает вам Form, который вы можете отобразить.

EDIT:

Для даты диапазона фильтра (даты начала и окончания) вы можете просто добавить 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', но он выпадает с такими параметрами, как« На этой неделе »,« Этот месяц »и т. Д. Если вам нужен фильтр диапазона с одной начальной датой и другим фильтром даты окончания, вы можете просто добавить 2 фильтра даты. (См. Обновленный ответ) – jproffitt

+0

Вы экономите мой день :) Я буду возиться с ним и вернуться, чтобы принять ваш ответ. Спасибо! – nutship

Смежные вопросы