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

Django筛选后数据分页异常求助:翻页显示非筛选数据

解决Django分页后筛选参数丢失的问题

这个问题的核心是分页跳转时没有携带筛选用的日期参数,导致第二页请求时视图无法获取f_date和t_date,从而执行了未筛选的全量查询。以下是具体的修复方案:

1. 视图函数:确保每次请求都获取筛选参数

修改视图逻辑,从GET请求中读取日期参数(分页请求默认是GET),并基于参数动态构建查询集:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Q
from django.shortcuts import render

def scrapper_records(request):
    # 从GET请求中获取日期参数,兼容首次请求和分页请求
    f_date = request.GET.get('f_date')
    t_date = request.GET.get('t_date')

    # 初始化查询集,仅在参数存在时添加筛选条件
    queryset = Scrapper.objects.all()
    if f_date and t_date:
        queryset = queryset.filter(Q(start_time__date=f_date)|Q(end_time__date=t_date))

    # 分页处理逻辑
    paginator = Paginator(queryset, 10)  # 每页展示10条数据
    page_num = request.GET.get('page')
    
    try:
        records = paginator.page(page_num)
    except PageNotAnInteger:
        # 页码非整数时返回第一页
        records = paginator.page(1)
    except EmptyPage:
        # 页码超出范围时返回最后一页
        records = paginator.page(paginator.num_pages)

    # 将筛选参数传递到模板,用于分页链接拼接
    context = {
        'records': records,
        'f_date': f_date,
        't_date': t_date
    }
    return render(request, 'your_template.html', context)

2. 模板:分页链接携带筛选参数

在模板的分页组件中,把f_date和t_date参数拼接到分页URL中,确保跳转时参数不丢失:

{% if records.has_other_pages %}
<nav>
  <ul class="pagination">
    <!-- 上一页链接 -->
    {% if records.has_previous %}
    <li>
      <a href="?page={{ records.previous_page_number }}&f_date={{ f_date }}&t_date={{ t_date }}">
        &laquo; 上一页
      </a>
    </li>
    {% endif %}

    <!-- 页码列表 -->
    {% for num in records.paginator.page_range %}
    {% if records.number == num %}
    <li class="active"><span>{{ num }}</span></li>
    {% else %}
    <li>
      <a href="?page={{ num }}&f_date={{ f_date }}&t_date={{ t_date }}">{{ num }}</a>
    </li>
    {% endif %}
    {% endfor %}

    <!-- 下一页链接 -->
    {% if records.has_next %}
    <li>
      <a href="?page={{ records.next_page_number }}&f_date={{ f_date }}&t_date={{ t_date }}">
        下一页 &raquo;
      </a>
    </li>
    {% endif %}
  </ul>
</nav>
{% endif %}

3. 额外优化:筛选表单使用GET方法

如果你的筛选是通过表单提交的,建议将表单的method设置为GET,这样提交后日期参数会自动出现在URL中,分页时直接复用即可,无需额外处理:

<form method="GET" action="{% url 'scrapper_records' %}">
  <input type="date" name="f_date" value="{{ f_date }}">
  <input type="date" name="t_date" value="{{ t_date }}">
  <button type="submit">筛选</button>
</form>

内容的提问来源于stack exchange,提问作者Ajay kk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:35:35