2012-11-28 2 views

답변

23

조금 늦게 대답하지만 어쨌든 ... 또한 열 필터링에 대한 적절한 문서를 찾을 수 없습니다. 그것을 할 수있는 많은 방법이 있습니다

으로 A. :

 
    data = models.MyClass.all() 
    form = forms.MyFilterForm(request.GET) 
    if request.GET.get('field1'): 
    data = data.filter(field1=request.GET.get('field1')) 
    if request.GET.get('field2'): 
    data = data.filter(field2=request.GET.get('field2')) 
    ... 
    table = tables.MyTable(data) 
: 난과 필터링하고 싶습니다 그리고 내가보기에이 같은 일을 할 필드를 포함하는 양식을 추가

이것은 매우 멋지지만, 너무보기가 어렵 기 때문에 너무 건조하지는 않습니다.

B.는 SingleTableView 사용 : 또 다른 방법입니다 양식이 포함 된 SingleTableView 추가 :이 더 DRY :)입니다

 
from django_tables2 import SingleTableView 
class FilteredSingleTableView(SingleTableView): 
    def get_table_data(self): 
    data= models.MyClass.objects.all 
    if self.request.GET.get('field1'): 
     data = data.filter(field1=self.request.GET.get('field1')) 
    if self.request.GET.get('field1'): 
     data = data.filter(field1=self.request.GET.get('field1')) 
    return data 

    def get_context_data(self, **kwargs): 
     context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
     context['form'] = forms.MyFilterForm(self.request.user, self.request.GET) 
     return context 

C. 사용 SingleTableView 및 django_filters를 : 이것은 아마도 가장 건조한 방법입니다 :) 그 방법은 다음과 같습니다.

먼저 필터를 정의하십시오 :

,210
 
class MyFilter(django_filters.FilterSet): 
    field1 = django_filters.CharFilter() 
    field2 = django_filters.CharFilter() 
... 

(또는 같은 SingleTableView을 만들 지금 메타 (모델 = MyModel)

에서 모델 필터를 추가 할 수 있습니다이

 
class FilteredSingleTableView(SingleTableView): 
    def get_table_data(self): 
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request) 
    return f 

    def get_context_data(self, **kwargs): 
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request) 
    context['form'] = f.form 
    return context 

(아마 라인 F에 문제가 = ...하지만 달리 작동하게 만들 수는 없었습니다.

마지막으로, 당신은 제네릭 클래스를 사용하여이

 
url(r'^$', views.FilteredSingleTableView.as_view(
    table_class = tables.MyTable, 
    model=models.MyClass, 
    template_name ='mytemplate.html', 
    table_pagination={ "per_page":50 })) , 
    name='filtered_single_table_view' 
), 

D.처럼 urls.py에서 SingleTableView를 호출 할 수를이 방법과 같은 더 건조하고 장고 - 일반 - 클래스 전망된다 ! 이것은 실제로 C에서 다음 단계 : 당신이 다른 가운데 당신의 urls.py에 전달할 수 있도록

 
class FilteredSingleTableView(django_tables2.SingleTableView): 
    filter_class = None 

    def get_table_data(self): 
    self.filter = self.filter_class(self.request.GET, queryset =super(FilteredSingleTableView, self).get_table_data()) 
    return self.filter.qs 

    def get_context_data(self, **kwargs): 
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
    context['filter'] = self.filter 
    return context 

이제 FilteredSingleTableView 필터의 클래스에 대한 매개 변수가 있습니다 : 그냥이처럼 FilteredSingleTableView 선언 매개 변수 :

수정없이 FilteredSingleTableView를 사용하면 모델을 필터링 할 수 있습니다. 그 다음 우리가 추가 할 수 항상 그런 것은 아니었다면 -

또한 지금 인스턴스 변수로 필터를 저장하고 내가 C (get_table_data이 get_context_data 전에 호출됩니다 에 있던 반복적 인 코드 f=filters.MyFilter(...)를 삭제 한 것을 알 수 get_filter 트릭을 수행 할 인스턴스 메소드)!

업데이트 23/04/2016 : 인기있는 수요 이후, 필자는 일반 FilteredSingleTableView 클래스를 사용하여 장부 테이블을 필터링하는 간단한 Django 프로젝트를 만들었습니다. 당신은 그것을 찾을 수 있습니다 https://github.com/spapas/django_table_filtering

업데이트 2016년 5월 7일 : 당신은 (나는을 벌써 이것에 대한 대답을 업데이 트했습니다) 그렇지 않으면 D에서 get_table_data 반환 return self.filter.qs을 사용하도록주의하십시오

from django_filters.views import FilterView 
from django_tables2 import SingleTableView 


class FilterTableView(FilterView, SingleTableView): 
    def get_table_data(self): 
     return self.object_list 

그래서 당신은이 작업을 수행 할 수 있습니다 - 뷰가 큰 테이블에 렌더링하는 데 시간이 너무 오래 걸릴 것입니다 대한 추가 정보는이 않는 일반적인 뷰를 구축 할 수있는 쉽고 드라이어 방법이 https://github.com/spapas/django_table_filtering/issues/1

3

에서 찾을 수 있습니다 :

class MyTableView(FilterTableView): 
    model = MyModel 
    table_class = MyTable 
    filterset_class = MyFilter 
0

당신은 장고의 ListView 또는 그 서브 클래스 (보다는 SingleTableView) 나는 다음과 같은 제안과 협력 django_tables2.views.SingleTableMixin를 사용하는 것을 선호하는 경우 :

class FilteredListViewMixin(object): 
    """ Uses django-filter to filter a ListView. """ 

    filter_class = None 

    def get_queryset(self): 
     qs = super(FilteredListViewMixin, self).get_queryset() 

     self.filter = self.filter_class(self.request.GET, 
             queryset=qs) 
     return self.filter.qs 

    def get_context_data(self, **kwargs): 
     context = super(FilteredListViewMixin, self).get_context_data(**kwargs) 
     context['filter'] = self.filter 
     return context 

그것은 django-tables2에 결합하지의 추가 혜택이있다 (DRY FTW) 일반 ListViews도 사용할 수 있습니다.