1

我有一个带有 ImageField 的模型。我已经设置了upload_to并创建了自己的FileSystemStorage类来处理使用唯一名称保存文件......但是......

此设置允许我为每个文件上传并保存一个具有唯一名称的文件(这很好),但我还需要它来删除以前存在的文件,例如

我上传 file1.png 并将其保存为 file1_xkdeujg.png (这只是一个随机字符串)

然后我进入 django admin(使用 django 管理界面,因此需要通过模型进行)并将该字段的图像更改为 fileNEW.png

现在需要做的是:

1)它将新文件保存为fileNEW_fjewiejk.png(每次保存图像时唯一的随机字符串) -完成

2)它将新文件保存到数据库中 -完成

3) 它从文件系统中删除旧文件 - file1_xkdeuig.png -未完成

问:有人可以帮我解决第 3 点吗?

一些代码:

class Page(models.Model):
    image           = models.ImageField(upload_to='pages/', storage=MyFileSystemStorage())

并且(从其他地方借用了大部分代码......):

class MyFileSystemStorage(FileSystemStorage):

    def get_valid_name(self, name):
            file_root, file_ext = os.path.splitext(name)
            return "%s_%s%s" % (file_root, rand_key(8), file_ext)

    def get_available_name(self, name):
            dir_name, file_name = os.path.split(name)
            file_root, file_ext = os.path.splitext(file_name)
            count = itertools.count(1)
            while self.exists(name):
                    name = os.path.join(dir_name, "%s_%s%s" % (rand_key(32),  count.next(), file_ext))
            return name
4

2 回答 2

1

答案来自 StackOverflow 上的一个类似问题......

基本上,您将原始图像存储在init方法中,然后在保存之前检查它是否已更改。

保存后,删除原图片路径下的图片。

也请参阅此答案(乔希的答案是我使用和喜欢的答案,因为它没有命中数据库)。

Django:保存时,如何检查字段是否已更改?

于 2011-03-18T15:46:49.493 回答
0

如果我理解正确,如果您重命名文件,则该文件将被复制而不是移动。覆盖 Page 类的 save 方法可以让您访问 old 和 dew 实例。 http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

您需要做的就是将旧文件名存储在一个变量中,然后在调用 super.save() 之后,您可以 os.system("rm "+path_to_file) 在文件更改的情况下。这有帮助吗?

于 2011-03-18T14:51:58.587 回答