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

Django自定义过滤分页如何实现翻页时保留过滤参数?

实现方案

第一步:修改视图逻辑(views.py)

首先要解决两个核心问题:参数同时支持POST/GET读取、生成过滤参数的URL编码串传给模板

from django.http import QueryDict

def recherche(request):
    # 1. 先收集所有前端过滤参数,同时兼容POST和GET请求
    filter_form_fields = [
        'kw_intemediaire', 'kw_assurance', 'kw_matricule',
        'kw_numero', 'kw_created_by', 'kw_date_posted'
    ]
    filter_params = {}
    for field in filter_form_fields:
        # 优先取POST提交的参数,翻页时取GET携带的参数
        val = request.POST.get(field) or request.GET.get(field)
        if val:
            filter_params[field] = val
    
    # 2. 转换为ORM查询用的过滤字典
    filters = {}
    if filter_params.get('kw_intemediaire'):
        filters['intermediaire__name__icontains'] = filter_params['kw_intemediaire']
    if filter_params.get('kw_assurance'):
        filters['assurance__name__icontains'] = filter_params['kw_assurance']
    if filter_params.get('kw_matricule'):
        filters['matricule__icontains'] = filter_params['kw_matricule']
    if filter_params.get('kw_numero'):
        filters['numero__icontains'] = filter_params['kw_numero']
    if filter_params.get('kw_created_by'):
        filters['created_by__name__icontains'] = filter_params['kw_created_by']
    if filter_params.get('kw_date_posted'):
        filters['date_posted__icontains'] = filter_params['kw_date_posted']
    
    dossiers = Dossier.objects.filter(**filters)
    
    # 分页逻辑保持不变
    p = Paginator(dossiers, 10)
    page_num = request.GET.get('page', 1)
    try:
        dossiers = p.page(page_num)
    except EmptyPage:
        dossiers = p.page(1)
    
    # 3. 把过滤参数转为URL编码串传给模板
    query_dict = QueryDict(mutable=True)
    query_dict.update(filter_params)
    filter_querystring = query_dict.urlencode()

    context = {
        'dossiers': dossiers,
        'intermediaires': Intermediaire.objects.all(),
        'assurances': Assurance.objects.all(),
        'filter_querystring': filter_querystring # 新增传入模板
    }
    return render(request, "dashboard/recherche.html", context)

优化建议:可以直接把搜索表单的提交方式改成method="get",这样所有参数默认走GET传递,无需兼容POST逻辑,还支持用户保存搜索结果链接、刷新页面不会重复提示提交表单。

第二步:修改分页模板

所有分页跳转链接都拼接上刚才传入的过滤参数串即可:

<div class="pagination">
    {% if dossiers.has_previous %}
    <a href="?page=1&{{ filter_querystring }}">Première page</a>
    <a href="?page={{ dossiers.previous_page_number }}&{{ filter_querystring }}">&laquo;</a>
    {% endif %}
    <p class="active">Page {{ dossiers.number }} sur {{ dossiers.paginator.num_pages }}</p>
    {% if dossiers.has_next %}
    <a href="?page={{ dossiers.next_page_number }}&{{ filter_querystring }}">&raquo;</a>
    <a href="?page={{ dossiers.paginator.num_pages }}&{{ filter_querystring }}">Dernière page</a>
    {% endif %}
  </div>

调整后翻页时所有已选的过滤参数都会跟随URL自动携带,不会出现重置的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:27:03