Django中如何通过ModelForm获取上传文件名并赋值给title字段
问题解决:Django上传文件时MultiValueDictKeyError('file')
错误原因
你在request.FILES['file']里用了键'file',但你的ModelForm对应的文件字段是模型里的video,表单提交后文件数据存在request.FILES['video']中,而非'file',这才触发了找不到键的错误。另外你的保存逻辑也存在问题,直接Video().save不会保存任何有效数据。
修正后的代码
views.py
def upload(request): vidform = VideoForm() if request.method == 'POST': vidform = VideoForm(request.POST, request.FILES) if vidform.is_valid(): # 从验证后的表单数据中获取文件,键为模型字段名'video' video_file = vidform.cleaned_data['video'] video_title = video_file.name # 先创建实例但暂不保存,补充title字段后再入库 video_instance = vidform.save(commit=False) video_instance.title = video_title video_instance.save() return render(request, 'base/home.html') # 验证失败时保留表单错误信息,不要重新初始化空表单 context = {'vidform': vidform} return render(request, 'base/upload.html', context)
模板必填设置
确保上传表单标签添加enctype="multipart/form-data",否则文件无法正确上传:
<form method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ vidform.as_p }} <button type="submit">上传</button> </form>
关键说明
- 从
vidform.cleaned_data获取文件比直接操作request.FILES更安全,因为已经经过表单验证。 - 使用
save(commit=False)可以在保存前修改实例字段,适合补充title这类需要额外处理的内容。 - 验证失败时不要重新创建空表单,否则用户之前的输入和错误提示会被清空,影响使用体验。
内容的提问来源于stack exchange,提问作者Nattan_45
相关产品推荐
相关产品推荐

