Django用户头像上传失败:表单无法保存request.FILES中图片问题求助
问题根因与修复步骤
1. 视图层核心错误修复
你现有代码存在3个直接导致图片无法保存的逻辑错误:
- 表单参数顺序错误:Django ModelForm的构造参数顺序为
(请求POST数据, 请求FILES数据, 实例对象),你将request.FILES放在第一位,导致表单无法正确识别文件数据 - 未校验保存头像表单:仅校验了用户信息表单
UserProfile的合法性,没有对PhotoUser表单做校验,也没有调用它的保存方法 - 头像表单未绑定对应用户实例:注释掉了
instance参数,头像表单不知道需要将图片关联到哪个用户的记录上
修正后的views.py代码:
def create_user(request): if request.method == 'POST': form = UserProfile(request.POST) # 修正参数顺序,先传POST再传FILES user_photo = PhotoUser(request.POST, request.FILES) print(request.FILES) # 此处可看到图片已成功传输 # 两个表单都要校验合法性 if form.is_valid() and user_photo.is_valid(): # 先保存用户信息得到用户实例 user = form.save() # 头像表单绑定对应用户的头像实例,提交保存 user_photo.instance = user.userphoto user_photo.save() else: form = UserProfile() user_photo = PhotoUser() return render(request,'user/user.html',{'form':form,'user_photo':user_photo})
2. 模板冗余代码修复
你的模板中重复定义了图片上传字段:{{user_photo}}已经会自动渲染id="id_img"的文件输入框,你又手动写了一遍相同ID的输入框,可能导致提交数据冲突,删掉手动写的<input type="file" name="img" accept="image/*" id="id_img">即可,修正后模板代码:
<form method="post" enctype="multipart/form-data" action="."> {% csrf_token %} {{form}} {{user_photo}} <input type="submit" value="Submit"> </form>
验证说明
你现有的模型定义、信号逻辑、路由配置、MEDIA配置都没有问题,完成上述两处修改后即可正常保存用户上传的头像。
内容的提问来源于stack exchange,提问作者mg777
相关产品推荐
相关产品推荐

