Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django表-列筛选_Python_Django_Django Tables2 - Fatal编程技术网

Python Django表-列筛选

Python Django表-列筛选,python,django,django-tables2,Python,Django,Django Tables2,我开始使用(从第一印象来看,我极力推荐),我问自己如何实现列过滤。我没有找到合适的文档,但我确信它就在某处。回答有点晚,但无论如何。。。我也找不到任何合适的列筛选文档。有很多方法可以做到这一点: A.手工操作:我添加了一个表单,其中包含我要筛选的字段,然后在视图中执行以下操作: data = models.MyClass.all() form = forms.MyFilterForm(request.GET) if request.GET.get('field1'): data

我开始使用(从第一印象来看,我极力推荐),我问自己如何实现列过滤。我没有找到合适的文档,但我确信它就在某处。

回答有点晚,但无论如何。。。我也找不到任何合适的列筛选文档。有很多方法可以做到这一点:

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) data=models.MyClass.all() form=forms.myFilterPerform(request.GET) 如果请求.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(数据) 这工作得非常好,但是它不是那么干,因为它在视图中是硬编码的

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 从django_表2导入SingleTableView 类FilteredSingleTableView(SingleTableView): def get_表格_数据(自身): 数据=models.MyClass.objects.all 如果self.request.GET.GET('field1'): data=data.filter(field1=self.request.GET.GET('field1')) 如果self.request.GET.GET('field1'): data=data.filter(field1=self.request.GET.GET('field1')) 返回数据 def获取上下文数据(自身,**kwargs): context=super(FilteredSingleTableView,self)。获取上下文数据(**kwargs) context['form']=forms.MyFilterForm(self.request.user,self.request.GET) 返回上下文 这更干燥:)

C.使用SingleTableView和django_过滤器:这可能是最干燥的方法:)以下是操作方法:

首先定义一个过滤器:

class MyFilter(django_filters.FilterSet): field1 = django_filters.CharFilter() field2 = django_filters.CharFilter() ... 类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 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' ), 类FilteredSingleTableView(SingleTableView): def get_表格_数据(自身): f=filters.MyFilter(self.request.GET,queryset=models.MyClass.objects.all(),request=self.request) 返回f def获取上下文数据(自身,**kwargs): context=super(FilteredSingleTableView,self)。获取上下文数据(**kwargs) f=filters.MyFilter(self.request.GET,queryset=models.MyClass.objects.all(),request=self.request) 上下文['form']=f.form 返回上下文 (可能f=…行有问题,但我无法使其正常工作

最后,您可以像这样从URL.py调用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 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' ), url(r'^$',views.FilteredSingleTableView.as_视图( table_class=tables.MyTable, model=models.MyClass, template\u name='mytemplate.html', 表分页={“每页”:50}), name='filtered\u single\u table\u 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(django_表2.SingleTableView): 过滤器类=无 def get_表格_数据(自身): self.filter=self.filter\u类(self.request.GET,queryset=super(FilteredSingleTableView,self.GET\u table\u data()) 返回self.filter.qs def获取上下文数据(自身,**kwargs): context=super(FilteredSingleTableView,self)。获取上下文数据(**kwargs) 上下文['filter']=self.filter 返回上下文 现在FilteredSingleTableView有一个过滤器类的参数,因此您可以在URL.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'), url(r'^$',ships.views.FilteredSingleTableView.as_视图( model=models.MyModel, table_class=tables.MyTable, template\u name='mytemplate.html', filter\u class=filters.MyFilter, ),name='myview'), 因此,您可以使用FilteredSingleTableView,无需修改即可过滤任何模型

还请注意,我现在已将过滤器保存为实例变量,并删除了我在C中使用的重复代码
f=filters.MyFilter(…)
(get\u table\u data在get\u context\u data之前被调用-如果情况并非总是如此,那么我们可以添加一个
get\u filter
实例方法来完成此任务)

更新日期2016年4月23日:在大众需求之后,我创建了一个简单的Django项目,它使用通用FilteredSingleTableView类来过滤一个图书表。您可以在以下网址找到它:


Update 05/07/2016:请注意,您应该使用
返回self.filter.qs
来获取
表中的数据
返回D(我已经阅读了更新后的答案)否则,对于大型表,视图将花费太长的时间进行渲染--有关详细信息,请参见

有一种更简单、更干练的方法来构建通用视图,请执行以下操作:

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
如果您更愿意与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(干FTW)耦合,这意味着它也可以与通用的
列表视图一起使用。

这是我使用django 2、Crispy Forms和Bootstrap 4编写的应用程序的完整工作示例:

url.py

从django.url导入路径
from.views导入ASTodasView
URL模式=[
路径(“asignatura/todas”,astdasview.as_view(),name=“as todas”),
]
视图.py

from.filters导入AsignaturaListFilter
from.forms导入AsignaturaFilterHelper
从。模型导入Asignatura、Calendario
表导入Asignaturable
from.utils导入页面过滤表视图
类AstdasView(PagedFilteredTableView):
过滤级