使用Django Paginator生成分页URL时参数重复叠加如何解决
问题诱因
request.get_full_path()返回的是包含当前URL所有查询参数的完整路径,当你访问过带?p=页码的分页页面后,模板拿到的current_uri已经携带了旧的p参数,直接在后面拼接新的?p=新页码就会导致多个p参数叠加,生成错误格式的URL。
解决方法
场景1:页面不需要保留除页码外的其他查询参数
直接修改视图层current_uri的取值即可,request.path仅返回不带查询参数的路径部分,拼接时不会携带旧参数:
return render( request, "project/tickets.html", { "tickets_count": total_count, "tickets_filter_count": filtered_count, "tickets": tickets, "filter": filter_set, "filter_project": filter_project, "current_uri": request.path, }, )
修改后模板代码无需调整,即可生成符合预期的分页URL。
场景2:页面需要保留筛选、排序等其他查询参数(通用方案)
自定义模板标签自动处理查询参数,保留其他参数的同时仅替换页码参数:
- 在你的Django应用下创建
templatetags/query_utils.py文件,编写自定义标签:
from django import template register = template.Library() @register.simple_tag def update_page_param(request, page_num): query_params = request.GET.copy() query_params['p'] = str(page_num) return f"{request.path}?{query_params.urlencode()}"
- 模板顶部加载自定义标签:
{% load query_utils %}
- 替换所有分页链接的href属性为调用该标签:
<!-- 首页链接示例 --> <a class="page-link" href="{% update_page_param request 1 %}"><<</a> <!-- 上一页链接示例 --> <a class="page-link" href="{% update_page_param request tickets.previous_page_number %}"><</a> <!-- 其他页码、下一页、尾页链接同理,替换对应页码值即可 -->
该方案不会出现参数叠加问题,同时可以保留用户已选择的筛选、排序等其他查询条件,适用范围更广。
内容的提问来源于stack exchange,提问作者Cheknov
相关产品推荐
相关产品推荐

