Django UploadFileForm表单无效,request.FILES为空问题排查
问题
参考Django文档实现文件上传功能,代码如下:
forms.py
from django import forms class UploadFileForm(forms.Form): title = forms.CharField(max_length=50) file = forms.FileField()
views.py
from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import UploadFileForm import os import sys def handle_uploaded_file(f): path = os.path.abspath(os.path.dirname(sys.argv[0])) fnFile = os.path.join(path, "gpp", "FILES", "QUESTIONS", "someFile.xyz") print(fnFile) with open(fnFile, 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk) def home(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) print(request.POST) print(request.FILES) if form.is_valid(): print(f"Valid form") handle_uploaded_file(request.FILES['file']) return HttpResponseRedirect('/success/url/') else: print("No valid form") else: form = UploadFileForm() return render(request, 'home.html', {'form': form})
表单前端显示正常,可选择文件,但提交后request.FILES为空,表单验证失败,日志如下:
[23/Mar/2024 10:02:35] "GET / HTTP/1.1" 200 1777 <QueryDict: {'csrfmiddlewaretoken': ['HWaddf1sBsKJc1k4CY9LiijIv1VAlxjWkRoFRixEP12rNDYyIx6zRYFC2MvPKIFm'], 'title': ['Test'], 'file': ['gpt.zip'], 'save': ['']}> <MultiValueDict: {}> No valid form [23/Mar/2024 10:04:33] "POST / HTTP/1.1" 200 1869
请问为何request.FILES为空,表单无法正常验证?
解决方法
核心原因:HTML表单缺少
enctype="multipart/form-data"属性,这是Django接收上传文件的必要条件。没有该属性时,浏览器仅会把文件名作为普通表单字段提交,不会传递文件内容,直接导致request.FILES为空。修复步骤:
- 修改前端模板
home.html中的表单标签,添加enctype="multipart/form-data"属性:<form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">上传</button> </form> - 确认表单的
method属性为post,这是文件上传的强制要求。
- 修改前端模板
额外检查:如果是手动渲染表单字段而非使用
form.as_p,需确保文件对应的<input>标签类型为file,Django的FileField默认会生成正确标签,但手动编写时需留意。
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

