Django的表 - 列筛选(Django Tables - Column Filtering)

2019-07-04 05:32发布

我开始使用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.qsget_table_datad回报(我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也。



文章来源: Django Tables - Column Filtering