删除模型图像的位置?

时间:2012-07-10 20:27:31

标签: django django-models django-forms

我有一个带有图像字段的模型,我希望能够使用ModelForm更改图像。更改图像时,应删除旧图像并替换为新图像。

我试过在ModelForm的clean方法中这样做:

    def clean(self):
        cleaned_data = super(ModelForm, self).clean()

        old_profile_image = self.instance.image
        if old_profile_image:
            old_profile_image.delete(save=False)        
        return cleaned_data

除非用户指示的文件不正确(例如,如果不是图像),否则这样可以正常工作,这会导致图像被删除而不保存任何新图像。我想知道删除旧图像的最佳位置在哪里?我的意思是,在删除旧图像之前,我可以确定新图像是否正确?

编辑: 如果可能的话,我更喜欢在我的ModelForm类中这样做。

2 个答案:

答案 0 :(得分:0)

一些答案​​:

ImageField应通过Python Imaging Library验证上传的文件是否为图像。如果不是,表单将不会验证。

您的ImageField应该在其路径属性中有旧文件的路径。

保存新图像后,可以删除旧图像。更好,不要将用户的文件名输入用作文件名。这样更安全,您可以使用相同的文件名 - 然后您只需每次都覆盖旧文件,然后删除删除步骤。

祝你好运。

答案 1 :(得分:0)

好的我想出了如何使用ModelForm以干净的方式完成它。基本上我创建了一个名为“ChangeImageForm”的类,它将确保在更改图像时删除旧图像。此外,如果图像无效,它也可以使用:

class ChangeImageForm(ModelForm):

    def clean(self):
        cleaned_data = super(ModelForm, self).clean()
        self.old_image = self.instance.image
        return cleaned_data

    def save(self, commit=True):
        instance = super(ChangeImageForm, self).save(commit)

        if self.old_image:
            self.old_image.delete(save=False)

        return instance

现在我可以通过继承ChangeImageForm轻松地将上述功能添加到带有图像字段的ModelForm中,如下所示:

class MyModelForm(ChangeImageForm):
    class Meta:
        model = MyModel # model with an image field

我认为重写ModelForm是最好的地方,而不是在Model类中,因为我只想在某些情况下删除旧图像。