Tho*_*mel 12 python django django-tables2
我开始使用django-tables2(我可以从第一印象中强烈推荐),我问自己如何实现列过滤.我没有找到相应的文档,但我确定它在某处.
Ser*_*eim 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:
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() ...
(或者您可以在Meta中添加模型过滤器(model = 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-generic-class-views的方式!这实际上是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:在大众需求之后,我创建了一个简单的Django项目,该项目使用通用的FilteredSingleTableView类来过滤书籍表.您可以在以下网址找到它:https://github.com/spapas/django_table_filtering
2016年7月5日更新:请注意您应该使用D中return self.filter.qs的get_table_data返回(我已经用此更新了答案),否则视图将花费太长时间来呈现大表 - 更多信息可以在https://github.com/spapas/django_table_filtering/issues/1
| 归档时间: |
|
| 查看次数: |
11368 次 |
| 最近记录: |