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

Django类视图无法识别文件上传,表单验证失败求助

Django FormView多文件上传验证失败问题解决

问题根源

你在MyFilesView的post方法中初始化表单时,没有将request.FILES传递给表单实例。尽管request.FILES已经接收到了上传文件,但表单无法读取到这些数据,导致验证失败并抛出"No file was submitted"错误。

修复步骤

1. 修正表单初始化逻辑

将post方法中的form = self.get_form()替换为以下代码(二选一即可):

方式一(符合FormView规范)

form = self.get_form(self.get_form_kwargs())

get_form_kwargs()方法默认会自动封装request.POST和request.FILES参数,是FormView推荐的表单初始化方式。

方式二(显式传递参数)

form = self.form_class(request.POST, request.FILES)

2. 确保模板表单包含正确编码类型

检查data_related/my_files.html中的表单标签,必须添加enctype="multipart/form-data"属性,否则浏览器无法正确传输文件:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">上传文件</button>
</form>

3. 优化多文件保存逻辑(可选)

因为你的UserUpload模型对应单个文件字段,表单验证通过后需要循环处理每个上传的文件,分别创建数据库记录:

def form_valid(self, form):
    files = self.request.FILES.getlist('file')
    for file in files:
        UserUpload.objects.create(
            user=self.request.user,
            file=file
        )
    return super().form_valid(form)

4. 简化上下文数据中的表单传递(可选)

get_context_data方法中无需重新调用self.get_form(),父类已经自动将表单实例加入上下文:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    user_files = UserUpload.objects.filter(user=self.request.user)
    files = [{'short_name': file.file.name, 'file_size': file.file_size, 'uuid': file.uuid} for file in user_files]

    paginator = Paginator(files, 10)
    page_number = self.request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    context.update({
        'user_files': files,
        'page_obj': page_obj,
        # 移除冗余的form赋值
    })
    return context

修改后的完整post方法示例

def post(self, request, *args, **kwargs):
    self.object = None
    form = self.get_form(self.get_form_kwargs())

    files = self.request.FILES.getlist('file')
    print(files)
    print("Files received:", request.FILES.getlist('file'))

    if form.is_valid():
        print("Form is valid")
        return self.form_valid(form)
    else:
        print("Form is not valid")
        for field, errors in form.errors.items():
            for error in errors:
                print(f"Error in {field}: {error}")
                messages.error(request, f"Error in {field}: {error}")
        return self.form_invalid(form)

内容的提问来源于stack exchange,提问作者David L.E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:27