Django ListView分页时如何保留URL中的GET筛选参数?
解决方法
参数丢失的原因是当前分页链接仅拼接了page参数,没有携带当前请求的其他筛选参数,只需修改模板中的分页链接生成逻辑,自动带上除page外的所有现有GET参数即可。
具体修改步骤
- 先确认模板上下文已注入request对象:Django 1.10+默认已开启
django.template.context_processors.request上下文处理器,无需额外配置。 - 修改
product_all.html中的分页部分代码,把所有分页链接的href属性替换为带现有参数的格式:
<nav aria-label="page navigation" class="d-flex justify-content-center mb-5 mt-3"> <ul class="pagination"> {% if page_obj.has_previous %} <li class="page-item"><a href="?{% for k,v in request.GET.items %}{% if k != 'page' %}{{ k }}={{ v }}&{% endif %}{% endfor %}page={{ page_obj.previous_page_number }}" aria-label="Previous" class="page-link"><span aria-hidden="true">Prev</span><span class="sr-only">Previous</span></a></li> {% endif %} {% for i in paginator.page_range %} {% if page_obj.number == i %} <li class="page-item active"><a href="#" class="page-link">{{ i }}</a></li> {% else %} <li class="page-item"><a href="?{% for k,v in request.GET.items %}{% if k != 'page' %}{{ k }}={{ v }}&{% endif %}{% endfor %}page={{ i }}" class="page-link">{{ i }}</a></li> {% endif %} {% endfor %} {% if page_obj.has_next %} <li class="page-item"><a href="?{% for k,v in request.GET.items %}{% if k != 'page' %}{{ k }}={{ v }}&{% endif %}{% endfor %}page={{ page_obj.next_page_number }}" aria-label="Next" class="page-link"><span aria-hidden="true">Next</span><span class="sr-only">Next </span></a></li> {% endif %} </ul> </nav>
优化方案(可选)
如果觉得模板里循环拼接参数太冗余,可以自定义模板过滤器统一处理参数拼接,方便多处复用:
- 在你的应用目录下新建
templatetags文件夹,添加__init__.py空文件和query_utils.py,内容如下:
from django import template register = template.Library() @register.simple_tag def get_merged_query_params(request, exclude_params=None): exclude_list = exclude_params.split(',') if exclude_params else [] params = request.GET.copy() for key in exclude_list: params.pop(key, None) return params.urlencode()
- 在模板顶部加载自定义标签:
{% load query_utils %} - 分页链接简化为如下格式即可:
?{% get_merged_query_params request exclude_params='page' %}&page={{ 对应页码 }}
修改完成后访问带筛选参数的页面,点击分页按钮时URL会自动保留所有现有筛选参数,格式符合?collection=Drawing&page=2的要求,筛选结果不会丢失。
内容的提问来源于stack exchange,提问作者tiffinie
相关产品推荐
相关产品推荐

