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 }}">«</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 }}">»</a> <a href="?page={{ dossiers.paginator.num_pages }}&{{ filter_querystring }}">Dernière page</a> {% endif %} </div>
调整后翻页时所有已选的过滤参数都会跟随URL自动携带,不会出现重置的问题。
内容的提问来源于stack exchange,提问作者Lynkou
相关产品推荐
相关产品推荐

