Django:django-tables2分页和过滤

  发布于 2023-02-07 06:16

我有一个由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})

我的模板:

{% csrf_token %} {{ my_filter }}

由于my_choiceGET中不存在KeyError,因此会导致KeyError .结果页面甚至没有加载.

1 个回答
  • 您使用的是哪个版本的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!

    2023-02-07 06:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有