我有一个由django-tables2生成的工作表:
my_filter = TestFilter(request.POST) table = TestTable(TestObj.objects.all(), order_by="-my_date") RequestConfig(request, paginate={"per_page": 10}).configure(table) return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
上面的代码返回一个包含数百个对象的表,这些对象整齐地分页,每页有10个项目.当我点击表格底部的"下一步"时,分页效果很好,我可以浏览不同的页面.但是,我注意到以下行为:
单击my_filter
其上显示原始未过滤表的子集
单击筛选表底部的"下一步"将显示未筛选表的第二页
my_filter
再次单击将显示已过滤表的第二页
我希望过滤器在导航不同页面时保持不变.我在这里发现了类似的问题.该解决方案表明需要更改html代码.但是,在我的情况下,django-tables2正在生成html.
如何使用django-tables2正确实现过滤分页?
-Update-
我尝试过使用GET而不是POST:
if request.method == 'GET': my_filter = TestFilter(request.GET) my_choice = my_filter.data['my_choice'] table = TestTable(TestObj.objects.filter(choice=my_choice), order_by="-my_date") RequestConfig(request, paginate={"per_page": 10}).configure(table) return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
我的模板:
由于my_choice
GET中不存在KeyError,因此会导致KeyError .结果页面甚至没有加载.
您使用的是哪个版本的django_tables2?我检查了源代码,发现django_tables2正在使用一个名为模板的模板标签querystring
来创建模板中的分页链接table.html
.该querystring
标签更新与寻呼参数的URL.所以django_tables2支持分页+过滤开箱即用(这就是我所记得的).
请尝试更新到最新版本的django_tables2,并确保使用默认table.html
模板来呈现表格.
您也使用GET或POST提交过滤表单吗?请确保通过GET提交!
最后,请看看我对Django Tables - Column Filtering这个问题的回答
更新:我仔细研究了您发布的代码:首先,您将后期数据传递给过滤器:您不能使用POST,POST必须仅用于修改数据的操作.我也看到你没有过滤任何东西,而是将.all()传递给桌子!实际过滤在哪里完成?您应该将过滤后的数据传递给表格,正如我在上面的答案中所描述的那样!
更新2:
您的视图的问题是,当您第一次访问该页面时,GET
字典不包含该my_choice
属性,因此在尝试my_choice
通过[]
运算符访问该属性时会抛出异常,因此您应该检查它是否确实存在使用例如.get()
,像这样:
my_filter = TestFilter(request.GET) my_choice = my_filter.data.get('my_choice') # This won't throw an exception if my_choice: # If my_choice existed on the GET dictionary this will return non-null value table = TestTable(TestObj.objects.filter(choice=my_choice), order_by="-my_date") else: table = TestTable(TestObj.objects.all(), order_by="-my_date") RequestConfig(request, paginate={"per_page": 10}).configure(table) return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
以上应该可行,但是通过自己进行查询集过滤 - 你几乎违反了每个django设计理念!
这就是为什么我告诉你阅读我对类似问题的另一个答案(Django Tables - Column Filtering),其中我建议使用django-filter,这是一个明确用于过滤查询集的包.请查看文档或我的答案,看看它是如何使用的(如果您有任何疑问,我很乐意提供帮助).
此外,您的代码还存在许多其他小问题:
你并不需要检查request.method
就是GET
-它总是会GET
因为你不会做任何POST
小号
您不应该包含{{ csrf_token }}
在您的模板中 - 只需要它POST
.
这个TestFilter
类实际上是Form
我推荐命名它 TestFilterForm
或类似的东西 - 如果你使用了django-filter,那么你就创建了一个FilterSet
名为的类TestFilter
.正确命名类是非常重要的,当我第一次看到你的代码时,我认为这个TestFilter
类是一个FilterSet
而不是一个Form
!