gpt4 book ai didi

python - Django:django-tables2 分页和过滤

转载 作者:太空狗 更新时间:2023-10-29 23:59:17 25 4
gpt4 key购买 nike

我有一个由 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,它显示原始未过滤表的子集
  • 点击筛选后表格底部的“下一步”将显示未筛选表格的第 2 页
  • 再次点击my_filter显示过滤表的第2页

我希望过滤器在浏览不同页面时保持不变。我发现了一个类似的问题here .该解决方案表明需要更改 html 代码。但是,在我的例子中,django-tables2 正在生成 html。

如何使用 django-tables2 正确实现带过滤的分页?

-更新-

我试过使用 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})

我的模板:

<form action="" method="get"> {% csrf_token %}
{{ my_filter }} <input type="submit" value="Apply Filter"/>
</form>

由于 GET 中不存在 my_choice,这会导致 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 design philosophy !

这就是为什么我告诉您阅读我对类似问题 (Django Tables - Column Filtering) 的其他回答,我在其中推荐使用 django-filter。这是一个明确用于过滤查询集的包。请查看文档或我的回答以了解如何使用它(如果您有任何疑问,我很乐意提供帮助)。

此外,您的代码还有许多其他小问题:

  • 您无需检查 request.method 是否为 GET - 它总是 GET 因为您赢了不执行任何 POST

  • 您不应将 {{ csrf_token }} 包含到您的模板中 - 它仅在 POST 时需要。

  • TestFilter 类实际上是一个 Form,这就是为什么我建议将其命名为 TestFilterForm 或类似的名称 - 如果您愿意使用 django-filter 然后你将创建一个名为 TestFilterFilterSet 类。类的正确命名非常重要,当我第一次看到您的代码时,我认为 TestFilter FilterSet 而不是 表格 !

关于python - Django:django-tables2 分页和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com