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

Django网站视频上传后无法显示问题求助

解决Django视频上传后无法显示、页面展示及下载功能的问题

看起来你已经搭好了视频上传的基础框架,但动态上传的视频没法显示,主要是因为媒体文件(用户上传的内容)和静态文件的处理逻辑完全不同,另外还需要补充上传页面和下载功能的实现。下面一步步帮你搞定:

一、修复上传视频无法显示的问题

1. 配置媒体文件核心参数(settings.py)

首先确保settings.py里正确设置了媒体文件的存储路径和访问URL:

# settings.py
import os

# 媒体文件的本地存储根目录(上传的视频会存在这里)
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 媒体文件的访问URL前缀(浏览器通过这个路径访问上传的视频)
MEDIA_URL = '/media/'

你的视频会被存在项目根目录/media/deploy/videos/年/月/日/下,通过/media/deploy/videos/...这样的URL访问。

2. 配置媒体文件的访问路由(项目根urls.py)

Django默认不会处理媒体文件的访问请求,需要在根urls.py中添加路由规则:

# 项目根urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('deploy.urls')),  # 假设你的deploy应用有独立的urls.py
]

# 开发环境下临时处理媒体文件访问(生产环境要用Nginx/Apache)
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

3. 修改模板中的视频引用路径(video_list.html)

你用{% static %}引用本地静态视频是对的,但上传的视频属于媒体文件,得用{{ object.videofile.url }}获取动态URL:

<!-- 替换掉原来的静态视频标签 -->
<video width='400' controls>
    <source src="{{ object.videofile.url }}" type='video/mp4'>
    Your browser does not support the video tag.
</video>

同时把那个空链接改成指向视频的跳转链接:

<a href="{{ object.videofile.url }}" target="_blank">查看原始视频</a>

二、完善视频上传页面功能

你模板里已经有{% url 'deploy:create' %}的跳转,但缺少对应的视图和模板,这里补充:

1. 编写上传视图(views.py)

添加一个CreateView来处理上传逻辑:

# views.py
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from django.utils.text import slugify
from .models import Video

class VideoCreateView(CreateView):
    model = Video
    fields = ['Video_Description', 'videofile']  # 允许用户输入描述+上传视频
    success_url = reverse_lazy('deploy:list')  # 上传成功后跳回列表页

    def form_valid(self, form):
        # 自动生成唯一slug(避免重复)
        base_slug = slugify(form.instance.Video_Description)
        # 给slug加时间戳保证唯一性
        form.instance.slug = f"{base_slug}-{form.instance.timestamp.timestamp()}"
        return super().form_valid(form)

2. 配置上传页面URL(deploy/urls.py)

在deploy应用的urls.py中添加路由:

# deploy/urls.py
from django.urls import path
from .views import VideoListView, VideoDetailView, VideoCreateView

app_name = 'deploy'

urlpatterns = [
    path('', VideoListView.as_view(), name='list'),
    path('video/<slug:slug>/', VideoDetailView.as_view(), name='detail'),
    path('upload/', VideoCreateView.as_view(), name='create'),
]

3. 上传页面模板(video_form.html)

CreateView默认会找deploy/video_form.html,创建这个文件:

{% extends "base.html" %}

{% block content %}
<h2>上传新视频</h2>
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">确认上传</button>
</form>
{% endblock %}

注意enctype="multipart/form-data"是必须的,否则无法上传文件。

三、实现视频下载功能

1. 编写下载视图(views.py)

添加一个视图函数处理文件下载:

# views.py
from django.http import FileResponse
import os
from django.conf import settings
from django.shortcuts import get_object_or_404
from .models import Video

def video_download(request, slug):
    video = get_object_or_404(Video, slug=slug)
    # 获取视频文件的本地绝对路径
    video_path = os.path.join(settings.MEDIA_ROOT, str(video.videofile))
    # 返回下载响应,as_attachment=True会触发浏览器下载而不是直接打开
    return FileResponse(open(video_path, 'rb'), as_attachment=True, filename=os.path.basename(video_path))

2. 配置下载URL(deploy/urls.py)

# deploy/urls.py
path('video/<slug:slug>/download/', video_download, name='download'),

3. 在模板中添加下载按钮

比如在列表页的循环里添加:

<!-- 在video_list.html的{% for object in object_list %}循环内添加 -->
<a href="{% url 'deploy:download' slug=object.slug %}" class="btn btn-success">下载视频</a>

额外提示

  • Slug唯一性:如果多个用户上传相同描述的视频,要确保slug不会重复,上面的代码用了「描述slug+时间戳」的方式,你也可以用随机字符串增强唯一性。
  • 文件格式验证:可以在表单或模型中添加验证,只允许上传mp4、mov等视频格式,防止用户上传无关文件。
  • 生产环境注意:不要依赖static()处理媒体文件,生产环境要配置Nginx/Apache直接指向MEDIA_ROOT目录,提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:37:20