发布
社区首页 >问答首页 >在哪里删除模型图像?

在哪里删除模型图像?
EN

Stack Overflow用户
提问于 2012-07-11 04:27:31
回答 2查看 177关注 0票数 4

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

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

代码语言:javascript
代码运行次数:0
复制
    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类中这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 02:55:09

好了,我想出了如何使用ModelForm以一种干净的方式来做这件事。基本上,我创建了一个名为'ChangeImageForm‘的类,它将确保在更改图像时删除旧图像。此外,如果图像无效,它也会起作用:

代码语言:javascript
代码运行次数:0
复制
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中:

代码语言:javascript
代码运行次数:0
复制
class MyModelForm(ChangeImageForm):
    class Meta:
        model = MyModel # model with an image field

我认为覆盖ModelForm是执行此操作的最佳位置,而不是在Model类中,因为我只想在某些情况下删除旧图像。

票数 0
EN

Stack Overflow用户

发布于 2012-07-11 05:21:41

以下是一些答案:

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

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

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

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11421404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档