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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:15:03