4

我有一个带有图像字段的模型,我希望能够使用 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 类中执行此操作。

4

2 回答 2

0

一些答案:

ImageField 应该通过 Python 图像库验证上传的文件是图像。如果不是,则表单将无法验证。

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

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

祝你好运。

于 2012-07-10T21:21:40.607 回答
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 类中,因为在某些情况下我只想删除旧图像。

于 2012-07-15T18:55:09.297 回答