Django带搜索筛选的表格分页功能不显示,该如何排查?
问题根因
你的分页逻辑仅在无搜索请求的else分支中执行,当用户发起搜索、代码走入if分支时,返回的allusername是未经过分页器封装的原生Django QuerySet对象,不包含has_other_pages等分页属性,因此模板中{% if allusername.has_other_pages %}的判断永远为假,分页栏不会渲染。
修复方案
第一步:调整views.py逻辑,把分页逻辑提取到公共区域,无论是否搜索都执行分页
@login_required() def ViewMCO(request): search_post = request.GET.get('q') if (search_post is not None) and search_post: allusername = Photo.objects.filter(Q(reception__icontains=search_post) | Q(partno__icontains=search_post) | Q( Customername__icontains=search_post) | Q(mcoNum__icontains=search_post) | Q(status__icontains=search_post) | Q(serialno__icontains=search_post)) if not allusername: allusername = Photo.objects.all().order_by("-Datetime") else: allusername = Photo.objects.all().order_by("-Datetime") # 分页逻辑移到条件分支外,无论是否搜索都执行 page = request.GET.get('page', 1) paginator = Paginator(allusername, 10) try: allusername = paginator.page(page) except PageNotAnInteger: allusername = paginator.page(1) except EmptyPage: allusername = paginator.page(paginator.num_pages) # 把搜索参数也传到模板,方便分页时携带 context = {'allusername': allusername, 'q': search_post} return render(request, 'ViewMCO.html', context)
第二步:优化模板分页链接,携带搜索参数,避免点击分页后丢失搜索条件
把模板中所有分页的a标签链接修改为携带q参数:
{% if allusername.has_previous %} <li><a href="?q={{ q }}&page={{ allusername.previous_page_number }}">«</a></li> {% else %} <li class="disabled"><span>«</span></li> {% endif %} {% for i in allusername.paginator.page_range %} {% if allusername.number == i %} <li class="active"><span>{{ i }} <span class="sr-only">(当前页)</span></span></li> {% else %} <li><a href="?q={{ q }}&page={{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} {% if allusername.has_next %} <li><a href="?q={{ q }}&page={{ allusername.next_page_number }}">»</a></li> {% else %} <li class="disabled"><span>»</span></li> {% endif %}
修改后无论是否有搜索条件,分页栏都会正常渲染,且分页跳转时不会丢失已输入的搜索内容。
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

