如何在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
相关产品推荐
相关产品推荐

