Django传递字典到HTML时反向解析错误及视频质量展示问题
Django + Pytube 视频下载器:反向解析错误与质量选项渲染修复
一、解决反向解析错误
你遇到的Reverse for 'download' with arguments '({'qualities': [...]})' not found错误,本质是重定向时不能直接将字典/复杂列表作为URL参数传递——Django的reverse函数仅支持字符串、数字这类可序列化到URL的简单类型,字典无法被解析为合法的URL参数。
修复方案:用Session存储复杂数据
将质量列表存入用户Session,再重定向到目标视图,从Session中取出数据传递给模板:
- 修改处理POST请求的
Yt视图:
def Yt(request): if request.method == 'POST': url = request.POST.get('url') yt = YouTube(url) # 筛选可直接下载的流(包含视频+音频) streams = yt.streams.filter(progressive=True, file_extension='mp4') # 生成索引+分辨率的元组列表 qualities = [(i, stream.resolution) for i, stream in enumerate(streams)] # 将质量列表存入Session request.session['qualities'] = qualities # 直接重定向到download视图,无需传参数 return redirect('download') return render(request, 'yt.html')
- 修改
Yt_det(对应download路由的视图):
def Yt_det(request): # 从Session取出质量列表,默认空列表防止报错 qualities = request.session.get('qualities', []) # 可选:取出后删除Session中的数据,避免用户刷新页面重复读取 # del request.session['qualities'] return render(request, 'Yt-down.html', {'qualities': qualities})
二、修复模板质量选项渲染问题
模板无法显示360p、720p等选项,大概率是循环时未正确解包元组数据。qualities是[(0, '360p'), (1, '720p')...]格式的元组列表,需要在循环中拆分每个元组的索引和分辨率:
修改Yt-down.html中的渲染代码:
<!-- 示例:下拉选择框 --> <form method="POST" action="{% url 'start_download' %}"> {% csrf_token %} <div> <label>选择下载质量:</label> <select name="quality_idx"> {% for idx, res in qualities %} <option value="{{ idx }}">{{ res }}</option> {% empty %} <option disabled>无可用下载质量</option> {% endfor %} </select> </div> <button type="submit">开始下载</button> </form>
关键说明:
- 用
for idx, res in qualities循环,直接解包每个元组的两个元素,分别对应流的索引和分辨率 - 添加
{% empty %}分支处理无可用质量的异常情况,提升用户体验
内容的提问来源于stack exchange,提问作者Basheer
相关产品推荐
相关产品推荐

