我开始使用Django的tables2 (我可以非常从第一印象建议)而我会问自己,如何实现列筛选。 我没有找到合适的文档,但我敢肯定,这是外面的某个地方。
Answer 1:
有点晚了答案,但无论如何...我也找不到列过滤任何适当的文件。 有许多方法来做到这一点:
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:
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:这可能是最干的方式:)这里是如何做到这一点:
首先定义过滤器:
class MyFilter(django_filters.FilterSet): field1 = django_filters.CharFilter() field2 = django_filters.CharFilter() ...
(也可以在元添加模型过滤器(型号=为MyModel)
现在,创建这样一个SingleTableView
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 = ...一个问题,但我不能让它工作,否则。
最后,你可以从你的urls.py这样叫SingleTableView
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.使用泛型类:这是一个更加干爽Django的仿制类的观点类似的方式! 这实际上是从C下一步:只要你的声明FilteredSingleTableView是这样的:
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具有该类的过滤器,所以你可以通过它在你的urls.py其他参数中的一个参数:
url(r'^$', ships.views.FilteredSingleTableView.as_view( model=models.MyModel, table_class=tables.MyTable, template_name='mytemplate.html' , filter_class = filters.MyFilter, ) , name='myview'),
所以,你可以使用FilteredSingleTableView无需修改用于过滤任何你的模型!
还要注意,我现在已经保存了过滤器作为一个实例变量,并删除重复代码f=filters.MyFilter(...)
我在C具有(get_table_data被get_context_data之前称为-如果这是情况并非总是如此然后我们可以添加一个get_filter
,会做的伎俩实例方法)!
更新23/04/2016:大众的需求后,我已经创建了一个使用通用FilteredSingleTableView类过滤的书一表一个简单的Django项目。 你可能会发现它在: https://github.com/spapas/django_table_filtering
更新2016年5月7日 :请注意,你应该使用return self.filter.qs
为get_table_data
在d回报(我alread更新了这个答案),否则视图将需要很长时间才能渲染大表- -更多信息上可以找到https://github.com/spapas/django_table_filtering/issues/1
Answer 2:
还有就是要建立一个通用视图做到这一点更容易和烘干机的方法:
from django_filters.views import FilterView
from django_tables2 import SingleTableView
class FilterTableView(FilterView, SingleTableView):
def get_table_data(self):
return self.object_list
所以,你可以这样做:
class MyTableView(FilterTableView):
model = MyModel
table_class = MyTable
filterset_class = MyFilter
Answer 3:
如果你喜欢使用django_tables2.views.SingleTableMixin
协力Django的ListView
或者其子类(而不是SingleTableView
)我建议如下:
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
也。