如何在Django类视图中对非当前绑定的其他模型实现分页
Django类视图中对其他模型数据分页的实现方案
完全可以实现,你可以直接复用Django内置的Paginator分页工具,在get_context_data方法中处理评论的分页逻辑即可。
修改后的视图代码示例:
from django.core.paginator import Paginator class ShopDetailView(VisitCounter, DetailView): model = Item template_name = 'shop/detail.html' context_object_name = 'item' # 自定义每页展示的评论数量 comments_per_page = 10 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 查询当前商品关联的所有评论,添加排序保证分页顺序稳定 comments_qs = Comment.objects.filter(comment_item=self.object).order_by('-create_time') # 初始化分页器 paginator = Paginator(comments_qs, self.comments_per_page) # 从请求参数中获取当前页码,默认返回第1页 page_num = self.request.GET.get('page', 1) # 获取当前分页页面对象,自动处理页码非法异常 page_obj = paginator.get_page(page_num) # 注入模板需要的变量 context['comments'] = page_obj.object_list context['page_obj'] = page_obj context['is_paginated'] = page_obj.has_other_pages() context['form'] = CommentCreationForm() return context
模板使用说明
- 渲染评论列表:直接遍历
comments变量即可,和原有逻辑用法完全一致 - 渲染分页控件可参考如下代码:
{% if is_paginated %} <div class="pagination"> <span class="step-links"> {% if page_obj.has_previous %} <a href="?page=1">« 第一页</a> <a href="?page={{ page_obj.previous_page_number }}">上一页</a> {% endif %} <span class="current"> 第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页 </span> {% if page_obj.has_next %} <a href="?page={{ page_obj.next_page_number }}">下一页</a> <a href="?page={{ page_obj.paginator.num_pages }}">最后一页 »</a> {% endif %} </span> </div> {% endif %}
注意:给评论查询集添加稳定的排序规则(比如按创建时间倒序),可以避免分页过程中出现数据重复、遗漏的问题
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

