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

如何在Django视图和分页中保留日期范围的搜索结果

问题根因

你的搜索逻辑仅在POST请求下触发日期范围筛选,而分页跳转时发送的是GET请求,不会携带之前提交的POST参数,所以每次翻页都会走到else分支返回全量收入记录。

修复步骤

1. 修改视图逻辑,兼容GET参数传递,同时保留表单校验能力

修改后的视图代码如下:

def SearchIncomeRange(request):
    # 优先从请求参数里取日期,支持GET和POST
    start_date = request.POST.get('start_date') or request.GET.get('start_date')
    end_date = request.POST.get('end_date') or request.GET.get('end_date')
    
    # 初始查询全量
    listIncome = Income.objects.all()
    # 初始化表单,优先用请求参数填充
    searchForm = IncomeSearchForm(request.POST or request.GET or None)
    
    # 只要有合法的日期参数就做筛选
    if searchForm.is_valid():
        start_date = searchForm.cleaned_data['start_date']
        end_date = searchForm.cleaned_data['end_date']
        listIncome = listIncome.filter(date__range=[start_date, end_date])

    paginator = Paginator(listIncome, 5)
    page = request.GET.get('page')
    paged_listIncome = paginator.get_page(page)

    # 计算总金额
    total = listIncome.aggregate(total = Sum('amount')).get('total') or 0

    context = {
        'listIncome': paged_listIncome,
        'searchForm': searchForm,
        'total': total,
        # 把日期参数传给模板,供分页拼接URL
        'start_date': start_date,
        'end_date': end_date,
    }

    return render(request, 'cashier/search_income_range.html', context)

2. 修改模板逻辑

2.1 修改搜索表单提交方式

把搜索表单的method属性从POST改成GET,搜索提交后日期参数会直接拼接在URL中,无需额外处理就能在翻页时携带:

<form method="GET" action="">
  {{ searchForm.as_p }}
  <button type="submit">搜索</button>
</form>

搜索场景用GET是更规范的选择,如果必须保留POST提交,需要额外用session存储搜索参数,实现复杂度更高。

2.2 修改分页按钮的URL拼接

在分页跳转的链接里追加当前的日期参数,示例如下:

<div class="pagination">
  {% if listIncome.has_previous %}
    <a href="?page={{ listIncome.previous_page_number }}&start_date={{ start_date }}&end_date={{ end_date }}">上一页</a>
  {% endif %}
  
  <span>当前页 {{ listIncome.number }} / {{ listIncome.paginator.num_pages }}</span>
  
  {% if listIncome.has_next %}
    <a href="?page={{ listIncome.next_page_number }}&start_date={{ start_date }}&end_date={{ end_date }}">下一页</a>
  {% endif %}
</div>

如果日期参数为空,拼接的空参数不会影响正常的全量数据分页逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:45:01