Python Django删除旧的配置文件映像会在save()方法中导致此错误';剖面图"img"x27;属性没有与其关联的文件

Python Django删除旧的配置文件映像会在save()方法中导致此错误';剖面图"img"x27;属性没有与其关联的文件,python,django,Python,Django,我有一个带有图像字段的配置文件模型。当用户上传新图像时,图像将被裁剪并调整大小。我想使用post\u save信号删除旧图像 型号.py class Profile(models.Model): profile_img = models.ImageField(upload_to='profile_img', default='/profile_img/default.png',

我有一个带有图像字段的配置文件模型。当用户上传新图像时,图像将被裁剪并调整大小。我想使用
post\u save
信号删除旧图像

型号.py

class Profile(models.Model):
    profile_img = models.ImageField(upload_to='profile_img',
                                    default='/profile_img/default.png',
                                    null=True,
                                    blank=True)

@receiver(post_init, sender=Profile)
def backup_image_path(sender, instance, **kwargs):
    instance._current_image = instance.profile_img


@receiver(post_save, sender=Profile)
def delete_old_image(sender, instance, **kwargs):
    if hasattr(instance, '_current_image'):
        if instance._current_image.path != instance.profile_img.path:
            instance._current_image.delete(save=False)
class ImageUploadForm(forms.ModelForm):
    x = forms.FloatField(widget=forms.HiddenInput())
    y = forms.FloatField(widget=forms.HiddenInput())
    width = forms.FloatField(widget=forms.HiddenInput())
    height = forms.FloatField(widget=forms.HiddenInput())

    class Meta:
        model = Profile
        fields = ("profile_img",)

    def save(self):
        profile = super(ImageUploadForm, self).save()
        x = self.cleaned_data.get('x')
        y = self.cleaned_data.get('y')
        w = self.cleaned_data.get('width')
        h = self.cleaned_data.get('height')

        image = Image.open(profile.profile_img)
        cropped_image = image.crop((x, y, w+x, h+y))
        resized_image = cropped_image.resize((300, 300), Image.ANTIALIAS)
        resized_image.save(profile.profile_img.path)

        return profile
删除当前图像时,下面的保存方法会引发错误。 错误来自此行
image=image.open(profile.profile\u img)

forms.py

class Profile(models.Model):
    profile_img = models.ImageField(upload_to='profile_img',
                                    default='/profile_img/default.png',
                                    null=True,
                                    blank=True)

@receiver(post_init, sender=Profile)
def backup_image_path(sender, instance, **kwargs):
    instance._current_image = instance.profile_img


@receiver(post_save, sender=Profile)
def delete_old_image(sender, instance, **kwargs):
    if hasattr(instance, '_current_image'):
        if instance._current_image.path != instance.profile_img.path:
            instance._current_image.delete(save=False)
class ImageUploadForm(forms.ModelForm):
    x = forms.FloatField(widget=forms.HiddenInput())
    y = forms.FloatField(widget=forms.HiddenInput())
    width = forms.FloatField(widget=forms.HiddenInput())
    height = forms.FloatField(widget=forms.HiddenInput())

    class Meta:
        model = Profile
        fields = ("profile_img",)

    def save(self):
        profile = super(ImageUploadForm, self).save()
        x = self.cleaned_data.get('x')
        y = self.cleaned_data.get('y')
        w = self.cleaned_data.get('width')
        h = self.cleaned_data.get('height')

        image = Image.open(profile.profile_img)
        cropped_image = image.crop((x, y, w+x, h+y))
        resized_image = cropped_image.resize((300, 300), Image.ANTIALIAS)
        resized_image.save(profile.profile_img.path)

        return profile

我不知道我的错误在哪里。

经过一个多小时的调试,我发现删除当前图像应该在处理新图像后执行
post\u save
信号是在
save()
方法之前执行的,因此我去掉了
post\u save
,在处理新上传的图像后,在
save()
方法中删除了当前图像

def save(self):
        profile = super(ImageUploadForm, self).save()
        x = self.cleaned_data.get('x')
        y = self.cleaned_data.get('y')
        w = self.cleaned_data.get('width')
        h = self.cleaned_data.get('height')

        image = Image.open(profile.profile_img)
        cropped_image = image.crop((x, y, w+x, h+y))
        resized_image = cropped_image.resize((300, 300), Image.ANTIALIAS)
        resized_image.save(profile.profile_img.path)
        # keep the default pic
        default_img_path = settings.MEDIA_ROOT + '/profile_img/default.png'
        if profile._current_image.path != default_img_path:
            profile._current_image.delete(save=False)

        return profile 
希望这能帮助其他人