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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:15:35