Python Django表-列筛选
我开始使用(从第一印象来看,我极力推荐),我问自己如何实现列过滤。我没有找到合适的文档,但我确信它就在某处。回答有点晚,但无论如何。。。我也找不到任何合适的列筛选文档。有很多方法可以做到这一点: 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中使用的重复代码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
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):
过滤级