Django中django-filters表格筛选提交后不生效如何解决?
问题定位
筛选不生效是视图层逻辑顺序和数据源取用错误导致的,属于django-filter集成的常见疏漏,核心问题两点:
- 你实例化
ContratosFilter后从未取用筛选生成的结果集,传给模板、用于分页的始终是未做任何筛选的全量Contratos.objects.all(),筛选逻辑完全没有作用到最终渲染的数据源上 - 分页逻辑初始化时绑定的是全量数据,即便筛选执行,分页结果也不会匹配筛选后的内容
修复步骤
1. 修正视图层逻辑
调整视图里的代码执行顺序,先做筛选,再基于筛选后的结果集做分页,不要提前查询全量表数据,修正后的views.py代码如下:
from django.core.paginator import Paginator from .models import Contratos from .filters import ContratosFilter def contratostabla(request): # 初始化筛选器,获取筛选后的结果集 myFilter = ContratosFilter(request.GET, queryset=Contratos.objects.all()) filtered_queryset = myFilter.qs # 分页基于筛选后的结果集实现 paginator = Paginator(filtered_queryset, 12) page_number = request.GET.get('page') page_obj = paginator.get_page(page_number) # 传参给模板,不需要额外传全量的contract对象 return render(request, 'contracts.html', { 'myFilter': myFilter, 'page_obj': page_obj })
2. 调整模板表格的遍历数据源
你之前如果是遍历contract渲染表格行,需要改成遍历分页对象page_obj,表格部分示例代码:
<form method="get"> {{myFilter.form}} <button class="btn btn-primary btn-sm" type="submit">Search</button> </form> <table class="table"> <thead> <tr> <th>ID</th> <th>合同名称</th> <th>发包方</th> <th>承包方</th> </tr> </thead> <tbody> {% for contrato in page_obj %} <tr> <td>{{ contrato.id }}</td> <td>{{ contrato.name }}</td> <td>{{ contrato.contractor }}</td> <td>{{ contrato.contractee }}</td> </tr> {% endfor %} </tbody> </table> <!-- 原有分页控件保持不变即可 -->
你终端已经捕获到带筛选参数的GET请求,说明表单提交逻辑完全正常,不需要调整filters.py和表单部分的代码,改完上述两处即可正常生效。
内容的提问来源于stack exchange,提问作者Mario A
相关产品推荐
相关产品推荐

