Python Django:Django-tables2分页和筛选
我有一个由django-tables2生成的工作表:Python Django:Django-tables2分页和筛选,python,django,django-tables2,Python,Django,Django Tables2,我有一个由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':
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
- 单击筛选表底部的“下一步”将显示未筛选表的第2页
- 再次单击my_filter(我的过滤器),显示过滤表的第2页
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})
我的模板:
<form action="" method="get"> {% csrf_token %}
{{ my_filter }} <input type="submit" value="Apply Filter"/>
</form>
{%csrf\u令牌%}
{{my_filter}}
由于GET中不存在
my_choice
,因此这会导致键错误。因此,页面甚至无法加载。您使用的是哪个版本的django_表2?我检查了源代码,发现django_tables2正在使用名为querystring
的模板标记在table.html
模板中创建分页链接。querystring
标记使用分页参数更新当前url。所以django_表2支持分页+开箱即用过滤(这就是我记得的)
请尝试更新到django_tables2的最新版本,并确保使用默认的table.html
模板呈现表格
您是否也在使用GET或POST提交筛选表单?请确保使用GET提交
最后,请看我对这个问题的回答
更新:我仔细查看了您发布的代码:首先,您正在将post数据传递给筛选器:您不能使用post,post只能用于修改数据的操作。我还看到,您不过滤任何内容,而是将.all()传递到表中!实际过滤在哪里完成?您应该将过滤后的数据传递到表中,正如我在上面的回答中所描述的那样
更新2:
您的视图存在的问题是,当您第一次访问页面时,GET
字典不包含my\u choice
属性,因此当试图通过[]
操作符访问my\u 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})
但是,通过自己进行do queryset筛选,您几乎违反了所有规则强>
这就是为什么我告诉您阅读我对类似问题()的另一个答案,在这个问题中,我建议使用which,它是一个显式用于过滤查询集的包。请检查文档或我的答案,看看如何使用它(如果您有问题,我很乐意提供帮助)
此外,您的代码还存在一些其他小问题:
- 您不需要检查
请求。方法是否为
-它将始终为GET
,因为您不会执行任何GET
s操作POST
- 您不应该将
包含到模板中-它仅用于{{csrf\u token}}
POST
类实际上是一个TestFilter
,这就是为什么我建议将其命名为表单
或类似的名称——如果您使用了django过滤器,那么您将创建一个名为TestFilter
的TestFilter
类。类的正确命名非常重要,当我第一次看到您的代码时,我认为FilterSet
类是TestFilter
而不是FilterSet
表单