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
相关产品推荐
相关产品推荐

