django-tables2 (처음 인상에서 크게 추천 할 수 있음)을 사용하기 시작했으며 열 필터링을 구현하는 방법을 스스로 묻습니다. 나는 적절한 문서를 찾지 못했지만 어딘가에 있다고 확신한다.Django Tables - Column Filtering
답변
조금 늦게 대답하지만 어쨌든 ... 또한 열 필터링에 대한 적절한 문서를 찾을 수 없습니다. 그것을 할 수있는 많은 방법이 있습니다
손으로 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를 : 이것은 아마도 가장 건조한 방법입니다 :) 그 방법은 다음과 같습니다.
먼저 필터를 정의하십시오 :
,210class 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
에서 찾을 수 있습니다 :
class MyTableView(FilterTableView):
model = MyModel
table_class = MyTable
filterset_class = MyFilter
당신은 장고의 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
도 사용할 수 있습니다.