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
希望这能帮助其他人