我有一个带有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
答案 0 :(得分:1)
答案来自StackOverflow上的类似问题......
基本上,您将原始图像存储在 init 方法中,然后在保存之前检查它是否已更改。
保存后,删除存储在原始图像路径中的图像。
也可以看到这个答案(Josh的回答是我使用过的,因为它没有碰到数据库而更喜欢。)
Django: When saving, how can you check if a field has changed?
答案 1 :(得分: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)
在文件发生变化的情况下。
这有帮助吗?