Django PostUpdateView保存图片抛出ValueError错误如何解决
问题根源
你设置blank=True和null=True不是导致报错的原因,问题出在两处:
- 模型的
save方法没有判断图片是否存在,就直接访问图片路径执行压缩逻辑 - 前端更新表单大概率没有添加上传文件必须的
enctype属性,导致提交时图片数据没有正常传递到后端
解决方案1:修改Post模型的save方法
在处理图片逻辑前增加非空判断,同时优化原有逻辑的分支判断:
def save(self, *args, **kwargs): super().save(*args, **kwargs) # 仅当存在图片时执行压缩逻辑 if self.image: img = Image.open(self.image.path) if img.height > 500 or img.width > 500: if img.height > img.width: factor=500/img.height nH=500 nW=img.width*factor output_size= (nH,nW) # 原代码此处为if,修改为elif避免宽高相等时的逻辑冗余 elif img.width > img.height: factor=500/img.width nW=500 nH=img.height*factor output_size= (nH,nW) else: output_size=(500,500) img = ImageOps.exif_transpose(img) img.thumbnail(output_size) img.save(self.image.path)
解决方案2:修改前端表单属性
Django 处理文件上传要求表单必须添加enctype="multipart/form-data"属性,Django Admin的表单默认自带该属性所以可以正常上传,你自己写的更新页面表单需要手动添加:
<form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存修改</button> </form>
以上两处修改完成后即可正常提交带/不带图片的更新请求,不需要给PostUpdateView添加额外配置。
内容的提问来源于stack exchange,提问作者Morgan
相关产品推荐
相关产品推荐

