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 }}"> « 上一页 </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 }}"> 下一页 » </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
相关产品推荐
相关产品推荐

