Django表单上传图片时clean()方法获取cleaned_data返回None问题排查
问题根源
你在视图中实例化表单时,没有传入上传的文件对象 request.FILES,Django 表单不会主动从请求中读取文件数据,必须显式传入才能让表单的 ImageField 捕获到上传内容,这就是你 clean_image 方法中始终拿到 None 的原因。
同时你后续直接从 request.FILES 读取文件保存,完全绕开了表单层的校验逻辑,所以你写的 clean_image 规则完全没有生效,只有管理后台自带的模型表单会默认处理文件上传,所以模型层的校验器仅在后台生效。
修复方案
- 修改
views.py中的表单实例化代码,补传文件参数:
# 原代码 form = AdditionalInfoForm(request.POST) # 修改为 form = AdditionalInfoForm(request.POST, request.FILES)
- 保存数据时直接使用表单校验后的
cleaned_data内容,不需要再手动从请求中取文件,确保校验逻辑生效:
# 原代码 img = request.FILES.get("image") # 修改为 img = cd.get('image')
可选优化
你当前表单层的 clean_image 和模型层的 validate_image 校验逻辑完全重复,建议直接改用 ModelForm 绑定 Profile 和 User 模型,可自动复用模型层的校验规则,无需重复写校验代码,减少维护成本。
另外注意代码中的拼写错误:avaible 应为 available,避免后续维护歧义。
内容的提问来源于stack exchange,提问作者bartnyk
相关产品推荐
相关产品推荐

