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

Django传递字典到HTML时反向解析错误及视频质量展示问题

Django + Pytube 视频下载器:反向解析错误与质量选项渲染修复

一、解决反向解析错误

你遇到的Reverse for 'download' with arguments '({'qualities': [...]})' not found错误,本质是重定向时不能直接将字典/复杂列表作为URL参数传递——Django的reverse函数仅支持字符串、数字这类可序列化到URL的简单类型,字典无法被解析为合法的URL参数。

修复方案:用Session存储复杂数据

将质量列表存入用户Session,再重定向到目标视图,从Session中取出数据传递给模板:

  1. 修改处理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')
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:05:53