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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:50:33