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

如何在Django单页面实现yt-dlp多下载功能且不修改URL?

问题描述

我正在用Django开发基于yt-dlp的下载工具,想做一个单页面,带切换选项或按钮——点击第一个选项/按钮时用yt-dlp下载最高画质视频,点击第二个时下载音频。目前我写了多个视图和页面,想知道怎么整合到同一个页面里。

原实现代码:

# views.py
from django.shortcuts import render, redirect
from yt_dlp import YoutubeDL

def hq(request):
    
    if request.method == 'POST':
        URLS = request.POST['HQ'] # 接收用户输入的URL
        opt = {
            'format' : 'bestvideo/best'
        }
        with YoutubeDL(opt) as ydl: # 加载配置并执行操作
            ydl.download(URLS) # 开始下载

        # print('下载成功')
    return render(request, 'video.html')
# 视图函数定义结束

def ad(request):
    
    if request.method == 'POST':
        URLS = request.POST['audio'] # 接收用户输入的URL
        opt = {
            'format': 'bestaudio/best',
        }
        with YoutubeDL(opt) as ydl: # 加载配置并执行操作
            ydl.download(URLS) # 开始下载

        # print('下载成功')
    return render(request, 'audio.html')
# 视图函数定义结束

def list(request):
    return render(request, 'list.html')
# list.html 
{% extends 'base.html' %}

{% block title %} 

列表页

{% endblock title %}



{% block body %}

<ul class="nav justify-content-center">
    <li class="nav-item">
      <a class="nav-link active" aria-current="page" href="http://127.0.0.1:8000/audio"> 音频下载 </a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="http://127.0.0.1:8000/ydl">视频下载</a>
    </li>
</ul>

{% endblock body %}
# audio.html 
{% extends 'base.html' %}

{% block title %}
仅下载音频 
{% endblock title %}


{% block body%}

<h1 class="display-1"> 仅下载音频 </h1>

<form method="post">
    {% csrf_token %}

<div class="input-group mb-3">
    <button class="btn btn-outline-secondary" type="submit" id="button-addon1">下载</button>
    <input type="text" name="audio" class="form-control" placeholder="仅下载音频" aria-label="Example text with button addon" aria-describedby="button-addon1">
</div>

</form>
{% endblock body %}
# video.html
{% extends 'base.html' %}

{% block title %} 

最高画质视频下载 

{% endblock title %}


{% block body %}

<h1 class="display-1"> 最高画质视频下载 </h1>

<br>

<form action="" method="post">
    {% csrf_token %}

<div class="input-group mb-3">
    <button class="btn btn-outline-secondary" type="submit" id="button-addon1">下载</button>
    <input type="text" name="HQ" class="form-control" placeholder="最高画质" aria-label="Example text with button addon" aria-describedby="button-addon1">
    </div>
</form>

{% endblock body %}

解决方案

1. 合并视图函数

把多个视图整合成一个,通过表单提交的参数判断下载类型:

# views.py
from django.shortcuts import render
from yt_dlp import YoutubeDL

def downloader(request):
    if request.method == 'POST':
        url = request.POST.get('url')
        download_type = request.POST.get('download_type')
        
        if not url:
            return render(request, 'downloader.html')
        
        opts = {}
        if download_type == 'video':
            opts['format'] = 'bestvideo/best'
        elif download_type == 'audio':
            opts['format'] = 'bestaudio/best'
        
        # 注意:yt-dlp的download方法需要接收URL列表
        with YoutubeDL(opts) as ydl:
            ydl.download([url])
    
    return render(request, 'downloader.html')

2. 创建单页面模板 downloader.html

整合所有功能到一个页面,用按钮区分下载类型:

{% extends 'base.html' %}

{% block title %}YT-DLP 下载工具{% endblock title %}

{% block body %}
<h1 class="display-4">YT-DLP 视频/音频下载</h1>
<br>

<form method="post">
    {% csrf_token %}
    <div class="input-group mb-3">
        <input type="text" name="url" class="form-control" placeholder="输入视频URL" aria-label="视频URL">
        <div class="btn-group" role="group">
            <button type="submit" name="download_type" value="video" class="btn btn-primary">下载最高画质视频</button>
            <button type="submit" name="download_type" value="audio" class="btn btn-secondary">下载音频</button>
        </div>
    </div>
</form>
{% endblock body %}

3. 更新URL配置

把所有路由指向新的视图:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.downloader, name='downloader'),
    # 旧路由可根据需求保留或删除
]

核心逻辑说明

  • 表单通过download_type参数区分下载类型,视图根据参数配置对应的yt-dlp格式
  • 统一用url字段接收用户输入,简化表单逻辑
  • 两个提交按钮直接触发对应类型的下载,操作更直观
  • 给yt-dlp的download方法传入URL列表,避免单个URL的解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:05:34