如何在Django的Serie详情页中分页展示Episodes?
解决方案
你的episodes是ArrayField存储的字符串列表,而非关联的模型QuerySet,因此无法直接复用列表视图的分页逻辑,需要手动对该列表做分页处理,具体实现如下:
1. 修改视图代码
导入分页工具类,重写get_context_data方法处理剧集分页:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.views.generic.detail import DetailView from .models import Serie class SerieDetailedView(DetailView): template_name = "tailwind/series_detail.html" model = Serie slug_url_kwarg = "serie_name" slug_field = "name" context_object_name = "project" # 每页展示的剧集数量 EPISODES_PER_PAGE = 10 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 获取当前Serie对象 serie = self.get_object() # 获取剧集列表,可在此处添加排序逻辑 episodes_list = serie.episodes # 示例:按剧集编号倒序(假设剧集格式为"S01E01") # episodes_list = sorted(serie.episodes, key=lambda x: (int(x[1:3]), int(x[4:6])), reverse=True) # 初始化分页器 paginator = Paginator(episodes_list, self.EPISODES_PER_PAGE) # 从URL参数获取当前页码,默认显示第一页 page = self.request.GET.get('page') try: episodes_page = paginator.page(page) except PageNotAnInteger: # 页码非整数时返回第一页 episodes_page = paginator.page(1) except EmptyPage: # 页码超出范围时返回最后一页 episodes_page = paginator.page(paginator.num_pages) # 将分页后的剧集数据传入模板 context['episodes_page'] = episodes_page return context
说明:
- 保留
get_object原有逻辑,确保DetailView正常获取单个Serie对象 - 通过
request.GET.get('page')接收分页参数,实现页码切换 - 可根据剧集格式自定义排序规则,示例中提供了按季、集编号排序的代码
2. 修改模板代码(series_detail.html)
渲染分页后的剧集列表及分页导航:
<!-- 展示Serie基本信息 --> <h1>{{ project.name }}</h1> <p>完结状态:{{ project.finished|yesno:"已完结,更新中" }}</p> <!-- 展示当前页剧集 --> <h2>剧集列表</h2> <ul> {% for episode in episodes_page %} <li>{{ episode }}</li> {% empty %} <li>暂无剧集</li> {% endfor %} </ul> <!-- 分页导航栏 --> <div class="pagination"> {% if episodes_page.has_previous %} <a href="?page={{ episodes_page.previous_page_number }}">上一页</a> {% endif %} <span>第 {{ episodes_page.number }} 页 / 共 {{ episodes_page.paginator.num_pages }} 页</span> {% if episodes_page.has_next %} <a href="?page={{ episodes_page.next_page_number }}">下一页</a> {% endif %} </div>
核心逻辑说明
- 利用Django的
Paginator直接处理Python列表(ArrayField取出的就是列表),和处理QuerySet的方式一致 - 分页通过URL的
page参数实现,例如访问/series/your-serie-name/?page=2即可查看第二页剧集
内容的提问来源于stack exchange,提问作者user17841947
相关产品推荐
相关产品推荐

