2011-08-10 13 views
12

Django 1.3のクラスベースのジェネリックビューを使用してイメージのリストを表示していますが、表示された結果を絞り込むためのフィルタを追加したいと思います。Djangoで(クラスベースの)汎用オブジェクトリストのフィルタフォームを作成するには?

私の現在のアプローチは動作しますが、かなりハック感じている:

class ImageFilterForm(ModelForm): 
    class Meta: 
     model = Image 

class ImageListView(ListView): 
    model = Image 

    def get_queryset(self): 
     qs = Image.objects.select_related() 
     for item in self.request.GET: 
      key, value = item, self.request.GET.getlist(item) 
      # ... Filtering here ... 
     return qs 

    def get_context_data(self, **kwargs): 
     context = super(ImageListView, self).get_context_data(**kwargs) 
     context['filter_form'] = ImageFilterForm(self.request.GET) 
     return context 

は汎用ビューにカスタムフィルタを追加するが、より良い手段はありますか?

答えて

20

私はミックスインを使用して、同じアプローチを使用していますが、ジェネリック:

class FilterMixin(object): 

    def get_queryset_filters(self): 
     filters = {} 
     for item in self.allowed_filters: 
      if item in self.request.GET: 
       filters[self.allowed_filters[item]] = self.request.GET[item] 
     return filters 

    def get_queryset(self): 
     return super(FilterMixin, self).get_queryset()\ 
       .filter(**self.get_queryset_filters()) 


class ImageListView(FilterMixin, ListView): 

    allowed_filters = { 
     'name': 'name', 
     'tag': 'tag__name', 
    } 

    # no need to override get_queryset 

これが受け入れられたフィルタのリストを指定することができます、そして、彼らは実際.filter()キーワードに対応している必要はありません。あなたは、より複雑なフィルタリングをサポートするためにそれを拡張することができます

+1

私はちょうど見つけ[django-filter](https://github.com/alex/django-filter)アプリを開き、mixinと組み合わせてください。私はそれが私のために十分にきれいだと思う;-)ありがとう! – cvk

+1

私はdjango-filterを使い、上記のget_queryset()メソッドと組み合わせてうまく動作します。 fyi、filter.qsは、フィルターセットオブジェクト(django-filterアプリケーションの一部)からフィルターされたクエリーセットを返す属性です – rsp

+0

この機能をforms.DateFieldに使用するには、どうすればよいですか? – Marcaum54

1

django-filterで見てみましょう(__inまたは__rangeフィルタをやったときに簡単な例は、コンマであるスプリット)、それはビュー内のデータをフィルタリングするための簡単な解決策は

+0

が有望に見えますが、AJAXが欠場します! – andi

関連する問題