You need to enable JavaScript to run this app. Django实现课程视频上下集按钮,最后一集下按钮跳转异常
优惠活动
大模型
产品
解决方案
定价
更多

Django实现课程视频上下集按钮,最后一集下按钮跳转异常

问题核心

当前下一集跳转链接的生成逻辑缺少集数边界判断,直接对当前视频的serial_number做+1运算生成跳转地址,当处于最后一集时,会计算出超出实际总集数的无效lecture参数,生成指向不存在页面的跳转链接。

模板层修复

在视图返回模板上下文时,新增传入当前课程的视频总集数变量total_lecture_count,再在模板中对上下集链接增加边界判断,从源头避免无效链接生成:

  • 上一集分支:仅当当前视频序号大于1时,生成跳转到serial_number-1的正常链接,否则渲染禁用状态按钮,提示已到第一集
  • 下一集分支:仅当当前视频序号小于总集数时,生成跳转到serial_number+1的正常链接,否则渲染禁用状态按钮,提示已到最后一集

参考模板代码:

{# 上一集按钮 #}
{% if video.serial_number > 1 %}
<a href="course?lecture={{ video.serial_number|add:-1 }}" class="btn">上一集</a>
{% else %}
<button class="btn" disabled>已经是第一集</button>
{% endif %}

{# 下一集按钮 #}
{% if video.serial_number < total_lecture_count %}
<a href="course?lecture={{ video.serial_number|add:1 }}" class="btn">下一集</a>
{% else %}
<button class="btn" disabled>已经是最后一集</button>
{% endif %}
视图层兜底校验

前端模板的判断不能完全依赖,需要在视图端对传入的lecture参数做强制边界校验,避免无效参数渲染出异常页面:

  1. 取出当前课程下所有有效视频,按serial_number排序后计算总集数,得到有效集数范围
  2. 对传入的lecture参数做类型转换,若参数超出1~总集数的范围,直接重定向到对应边界的有效集数页面,拒绝无效请求的正常渲染
  3. 将计算得到的总集数传入模板上下文,供前端按钮判断使用

参考视图逻辑:

# 获取当前课程下按序号排序的所有有效视频
course_videos = Video.objects.filter(course=current_course).order_by("serial_number")
total_lecture_count = course_videos.count()

# 解析传入的lecture参数
raw_lecture = request.GET.get("lecture", 1)
try:
    target_serial = int(raw_lecture)
except ValueError:
    target_serial = 1

# 边界拦截,处理无效参数
if target_serial > total_lecture_count:
    return redirect(f"course?lecture={total_lecture_count}")
if target_serial < 1:
    return redirect("course?lecture=1")

# 组装模板上下文
context = {
    "video": course_videos.get(serial_number=target_serial),
    "total_lecture_count": total_lecture_count
}
注意事项
  • 必须保留视图层的校验逻辑,用户可手动修改地址栏的lecture参数,仅靠前端判断会出现被篡改地址访问异常内容的问题
  • 禁用状态的按钮需要配套置灰的视觉样式,明确告知用户当前按钮不可点击

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 00:45:07