添加FileField时出现'InMemoryUploadedFile无法JSON序列化'错误原因
问题原因与解决方案
错误根源
报错 Object of type InMemoryUploadedFile is not JSON serializable 的核心原因:
- 在
InsertAndInfo视图中,你将从request.FILES获取的**文件对象(InMemoryUploadedFile类型)**直接放入字典,通过requests.post的json参数发送请求。但JSON仅支持基础数据类型,无法序列化二进制文件对象,因此触发类型错误。 - 你手动设置了
Content-Type: application/json头,强制用JSON格式传输,但文件上传必须使用multipart/form-data格式,这是文件传输的标准协议。
修复步骤
修改 InsertAndInfo 视图的POST请求逻辑,改用multipart/form-data格式传输文件:
修改后的views.py代码
def InsertAndInfo(request): if request.method == 'POST': name = request.POST.get('name') email = request.POST.get('email') phone = request.POST.get('phone') file = request.FILES.get('filedf') # 使用get避免未上传文件时抛出KeyError # 分离普通字段与文件字段 form_data = { 'name': name, 'email': email, 'phone': phone } # 仅当存在文件时构造files字典 files = {'file': file} if file else {} # 发送请求:用data传递普通字段,files传递文件,无需手动设置Content-Type requests.post( 'http://127.0.0.1:8000/api/employees/', data=form_data, files=files ) return redirect("/api/") # 以下代码保持不变 employeeInfoApiLink = requests.get('http://127.0.0.1:8000/api/AllElmployeeInfo/').json() context = { "employeeInfo": employeeInfoApiLink } return render(request, 'InsertAndInfo.html', context)
额外注意事项
- API视图兼容性:你的
employeeListView视图无需额外修改,Django REST Framework会自动解析multipart/form-data请求中的文件数据,request.data能正确获取文件对象,Serializer可正常处理并保存到数据库。 - 文件存储权限:确保Django项目对
upload_to指定的file/目录有写入权限,否则文件保存时会抛出权限错误。 - 前端表单配置:你的
form.html已正确设置enctype="multipart/form-data",这是文件上传的必要配置,无需修改。
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

