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

Django Paginator在CBV中无法正常分页显示问题求助

解决Django CBV ListView中分页不生效的问题

你在分页实现上有几个关键的小疏漏,我帮你梳理并修正:

1. 分页后的对象未更新到上下文

你在get_context_data里先把未分页的query_ID_list存入了context_data,之后虽然完成了分页逻辑,但没有把分页后的对象重新赋值回上下文。模板最终拿到的还是未分页的完整数据集,自然看不到分页效果。

2. ListView错误重写了get_object方法

get_object是DetailView这类单对象视图用来获取单个实例的方法,而ListView应该通过重写get_queryset来指定默认查询集,这个属于规范问题,不影响功能但建议修正。

3. 分页链接丢失部分搜索参数

你的分页链接只携带了q1ID,但搜索还有q1bisID(名)和q1terID(出生地)两个参数,切换页面时会丢失这些条件,导致分页后搜索结果被重置。


修正后的视图代码

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Individu
import lib

class IdentityIndividuResearchingView(LoginRequiredMixin, ListView) :
    template_name = 'Identity_Individu_Recherche.html'
    model = Individu
    context_object_name = 'queryset'

    # 修正:ListView用get_queryset指定默认查询集
    def get_queryset(self) :
        return Individu.objects.order_by("-id")

    def get_context_data(self, **kwargs) :
        context_data = super().get_context_data(**kwargs)
        person_France = Individu.objects.filter(Pays='FR')
        context_data['person_France'] = person_France

        if 'recherche' in self.request.GET:
            query_lastname_ID = self.request.GET.get('q1ID')
            query_firstname_ID = self.request.GET.get('q1bisID')
            query_naissance_ID = self.request.GET.get('q1terID')
            sort_params = {}
            lib.Individu_Recherche.set_if_not_none(sort_params, 'Nom__icontains', query_lastname_ID)
            lib.Individu_Recherche.set_if_not_none(sort_params, 'Prenom__icontains', query_firstname_ID)
            lib.Individu_Recherche.set_if_not_none(sort_params, 'VilleNaissance__icontains', query_naissance_ID)
            query_ID_list = Individu.objects.filter(**sort_params)
            
            # 执行分页逻辑
            paginator = Paginator(query_ID_list, 3)
            page = self.request.GET.get('page', 1)
            try:
                paginated_query = paginator.page(page)
            except PageNotAnInteger:
                paginated_query = paginator.page(1)
            except EmptyPage:
                paginated_query = paginator.page(paginator.num_pages)
            
            # 关键:将分页后的对象存入上下文
            context_data['query_ID_list'] = paginated_query
            # 把搜索参数存入上下文,方便模板复用
            context_data['search_params'] = {
                'q1ID': query_lastname_ID,
                'q1bisID': query_firstname_ID,
                'q1terID': query_naissance_ID
            }
        return context_data

修正后的模板分页链接

把所有搜索参数都带到分页链接里,避免切换页面丢失条件:

{% if query_ID_list %}
<table class="tableform" style="width:85%">
<tbody>
<tr>
<th>ID</th>
<th>État</th>
<th>N° Identification</th>
<th>Civilité</th>
<th>Nom</th>
<th>Prénom</th>
<th>Date de Naissance</th>
<th>Ville de Naissance</th>
<th>Pays de Naissance</th>
<th>Institution</th>
</tr>
{% for item in query_ID_list %}
<tr>
<td>{{ item.id}}</td>
<td>{{ item.Etat}}</td>
<td>{{ item.NumeroIdentification}}</td>
<td>{{ item.Civilite }}</td>
<td>{{ item.Nom }}</td>
<td>{{ item.Prenom }}</td>
<td>{{ item.DateNaissance }}</td>
<td>{{ item.VilleNaissance }}</td>
<td>{{ item.PaysNaissance }}</td>
<td>{{ item.InformationsInstitution }}</td>
</tr>
{% endfor %}
</tbody>
</table>

{% if query_ID_list.has_previous %}
<a href="?page={{ query_ID_list.previous_page_number }}&q1ID={{ search_params.q1ID }}&q1bisID={{ search_params.q1bisID }}&q1terID={{ search_params.q1terID }}">Page précédente</a>
{% endif %}
<span class="current"> Page {{ query_ID_list.number }} sur {{ query_ID_list.paginator.num_pages }}. </span>
{% if query_ID_list.has_next %}
<a href="?page={{ query_ID_list.next_page_number }}&q1ID={{ search_params.q1ID }}&q1bisID={{ search_params.q1bisID }}&q1terID={{ search_params.q1terID }}">Page suivante</a>
{% endif %}
{% endif %}

额外加了{% if query_ID_list %}的判断,避免没有搜索时模板出现空对象报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:13