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参数做强制边界校验,避免无效参数渲染出异常页面:
- 取出当前课程下所有有效视频,按serial_number排序后计算总集数,得到有效集数范围
- 对传入的
lecture参数做类型转换,若参数超出1~总集数的范围,直接重定向到对应边界的有效集数页面,拒绝无效请求的正常渲染 - 将计算得到的总集数传入模板上下文,供前端按钮判断使用
参考视图逻辑:
# 获取当前课程下按序号排序的所有有效视频 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
相关产品推荐
相关产品推荐

