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

Django PostUpdateView保存图片抛出ValueError错误如何解决

问题根源

你设置blank=True和null=True不是导致报错的原因,问题出在两处:

  1. 模型的save方法没有判断图片是否存在,就直接访问图片路径执行压缩逻辑
  2. 前端更新表单大概率没有添加上传文件必须的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:04