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

