У меня есть модель с ImageField. Я уже установил upload_to и создал свой собственный класс FileSystemStorage для сохранения файла с уникальным именем... однако...
Эта настройка позволяет мне загружать и сохранять файл с уникальным именем для каждого файла (это нормально), но мне также нужно удалить предыдущий файл, который существовал, например.
Я загружаю file1.png, и он сохраняется как file1_xkdeujg.png (это просто случайная строка)
Затем я захожу в администратора django (используя интерфейс администратора 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