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

Django项目中视频上传表单无法显示问题求助

问题描述

我在Django项目中配置了两个表单,一个用于处理Excel文件上传,另一个用于处理视频文件上传,但视频文件对应的表单始终无法显示。此前设置media路径时本地运行提示资源不可用,因此将MEDIA_ROOT设为项目根目录。以下是项目相关代码,自行搜索未找到原因,恳请帮忙排查:


项目代码片段

settings.py

# Media uploading
MEDIA_ROOT= os.path.join(BASE_DIR, '')
MEDIA_URL= "/"

urls.py

from django.urls import path
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

import hello.views  

urlpatterns = [
    path("", hello.views.upload_file, name="index"),
    path("upVideo", hello.views.showVideo, name="videoUpload"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

models.py

from django.db import models

class Document(models.Model):
    docfile = models.FileField()

class Video(models.Model):
    name= models.CharField(max_length=500)
    videoFile= models.FileField(upload_to='videos/', null=True, verbose_name="")
    videoFile= models.FileField(upload_to='somewhere/')

    def __str__(self):
        return self.name + ": " + str(self.videoFile)

forms.py

from django import forms
from .models import Video

class UploadFileForm(forms.Form):
    file = forms.FileField()

class VideoForm(forms.ModelForm):
    class Meta:
        model= Video
        fields= ["name", "videoFile"]

views.py

from django.shortcuts import render
from django import forms

from .models import Video
from .forms import UploadFileForm,VideoForm

#**************File Upload View****************#
def upload_file(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            extract = handle_uploaded_file(request.FILES['file'].file)
            return render (request, 'dataDisplay.html', {'data':extract})
    else:
        form = UploadFileForm()
    return render(request, "index.html",{"form": form})

#**************Video Upload View****************#
def showVideo(request):
    if request.method == "POST":
        lastVideo= Video.objects.last()
        videoFile= lastVideo.videoFile
        vForm= VideoForm(request.POST, request.FILES)
        context= {'videoFile': videoFile,
                'vForm': vForm
                }

        if vForm.is_valid():
            vForm.save()
            return render(request, 'index.html', context)
        else:
            vForm = VideoForm()
        return render(request, "index.html",{"vForm": vForm})

index.html

<form action="" enctype="multipart/form-data"  method="post" id="uploadingForm" target="_blank">
    {% csrf_token %}
    <span id="uploadedFile">{{ form }}</span>
    <input type="submit" value="Submit" id="uploadButton">
</form>

<div id="uploadSection2">
    <span>Option 3: Site Data</span>
    <h1>Video Uploader</h1>
    <form enctype="multipart/form-data" method="POST" action={% url 'videoUpload' %}>
        {% csrf_token %}
        {{ vForm.as_p }}
    <input type="submit" value="Upload" disabled> <!-- forcefully disabled until figured out how-->
    </form>
</div>

问题排查与修复方案

1. 视频表单未传入模板上下文

访问首页时调用的upload_file视图仅向模板传递了Excel上传表单form,没有传递视频表单vForm。模板中渲染视频表单用的{{ vForm.as_p }}找不到对应变量,因此无法显示。

修复:修改upload_file视图,在GET请求时初始化VideoForm并传入上下文:

def upload_file(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            extract = handle_uploaded_file(request.FILES['file'].file)
            return render (request, 'dataDisplay.html', {'data':extract})
    else:
        form = UploadFileForm()
        vForm = VideoForm()  # 新增初始化视频表单
    return render(request, "index.html",{"form": form, "vForm": vForm})  # 将vForm加入上下文

2. Video模型重复定义字段

Video模型中两次定义了videoFile字段,后一个会覆盖前一个,导致表单生成异常,甚至数据库迁移报错。

修复:删除重复字段,保留一个即可:

class Video(models.Model):
    name= models.CharField(max_length=500)
    videoFile= models.FileField(upload_to='videos/', null=True, verbose_name="")

    def __str__(self):
        return self.name + ": " + str(self.videoFile)

3. showVideo视图逻辑错误

  • 若数据库中无Video记录,Video.objects.last()会返回None,访问lastVideo.videoFile会触发AttributeError;
  • 表单验证失败时,重新初始化空表单会丢失错误提示信息。

修复:调整视图逻辑:

def showVideo(request):
    context = {}
    # 安全获取最后一个视频记录
    last_video = Video.objects.last()
    if last_video:
        context['videoFile'] = last_video.videoFile
    
    if request.method == "POST":
        vForm = VideoForm(request.POST, request.FILES)
        if vForm.is_valid():
            vForm.save()
            # 保存成功后更新最新视频
            context['videoFile'] = Video.objects.last().videoFile
            context['vForm'] = VideoForm()  # 重置为空表单
        else:
            context['vForm'] = vForm  # 保留带错误信息的表单
    else:
        context['vForm'] = VideoForm()  # GET请求初始化空表单
    
    return render(request, "index.html", context)

4. MEDIA配置不规范

将MEDIA_ROOT设为项目根目录会导致上传文件与项目代码混放,容易引发资源冲突。

修复:规范MEDIA路径配置:

# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

上传的文件会统一存放到项目根目录下的media文件夹中,路径清晰且符合Django最佳实践。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:29:57