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
相关产品推荐
相关产品推荐

