1

date_fromdate_tostudentAおよびstudentBフィルターがあります。

それらの 1 つ、いくつか、すべてを使用して、または一度に 1 つも使用せずに、データをフィルター処理できるようにしたいと考えています。それらのどれも、データ全体が表示されることを意味しません-フィルターは適用されません。

たとえば、日付範囲でフィルタリングすることを選択して送信したとします。選択した期間のデータが表示されます。フォーム (日付範囲フィルター条件) をクリアすると、フィルターが使用されていないため、データ全体が再びポップアップ表示されます。

これを機能させるために、次のように条件を定義しました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))

この条件がなかった場合、上記の手順でフィルターをクリアしたときに、データがポップアップ表示されませんでした。

フィルターが 1 つまたは 2 つある場合、これは問題ではありませんが、フィルターが増えると、コードが急速に成長し始めます。たとえば、多くの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 つのフィルターを追加できます。1 つはlteルックアップ付き、もう 1 つは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 に答える