You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:13:11