Django分页器与过滤器冲突:切换分页时过滤器失效
Django分页与过滤器失效问题修复
核心问题出在分页链接里没带上搜索参数g_searched——用户点击分页按钮时,只有page参数被传到后端,g_searched丢失,导致后端用默认值1重新过滤,自然就变成了拉取包含1的全部记录,而非之前的搜索结果。
具体修复步骤
1. 修正后端默认值与过滤逻辑
原代码中g_searched的默认值设为1,会导致用户未搜索时自动过滤含1的记录,不符合预期,同时要增加空值判断:
def group_search(request): if request.method == "GET": # 将默认值改为空字符串,避免无搜索时自动过滤含1的记录 g_searched = request.GET.get("g_searched", "") request.session['csv_searched'] = g_searched # 仅当有搜索关键词时执行过滤,否则返回空结果(或全部记录,按需调整) if g_searched: group_searched = Binders.objects.filter(Q(group_id__contains=g_searched)) else: group_searched = Binders.objects.none() group_count = group_searched.count() p = Paginator(group_searched, 20) page = request.GET.get('page', 1) page_obj = p.get_page(page) pg_nums = "a" * page_obj.paginator.num_pages context = {'g_searched': g_searched, 'page_obj': page_obj, 'pg_nums': pg_nums, 'group_count': group_count} return render(request, "group_search.html", context) else: return render(request, "group_search.html", {})
2. 前端分页链接追加搜索参数
所有分页按钮的href都要带上g_searched参数,保证切换页面时搜索条件不丢失,同时修正num_core的笔误:
<!-- ======= Page Navigation Section ======= --> <nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> {% if page_obj.has_previous %} <li class="page-item"><a class="page-link" href="?page=1&g_searched={{ g_searched }}">First</a></li> <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}&g_searched={{ g_searched }}">Previous</a></li> {% endif %} {% for i in pg_nums %} <li class="page-item"><a class="page-link" href="?page={{ forloop.counter }}&g_searched={{ g_searched }}">{{ forloop.counter }}</a></li> {% endfor %} {% if page_obj.has_next %} <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}&g_searched={{ g_searched }}">Next</a></li> <!-- 修正num_core为num_pages --> <li class="page-item"><a class="page-link" href="?page={{ page_obj.paginator.num_pages }}&g_searched={{ g_searched }}">Last</a></li> {% endif %} </ul> </nav>
3. 优化搜索框体验(可选)
给搜索框加上value="{{ g_searched }}",让搜索后输入框保留当前关键词:
<input aria-label="Group Search" class="form-control me-2 " name="g_searched" placeholder="Search GROUPs" type="search" value="{{ g_searched }}">
修复原理
当用户点击分页按钮时,浏览器会发送包含page和g_searched的GET请求,后端能正确拿到之前的搜索关键词,维持过滤条件,分页展示的就还是搜索后的结果,不会回到全部记录。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

