Django ImageField - как настроить имя + удалить старый файл - PullRequest
1 голос
/ 18 марта 2011

У меня есть модель с ImageField в нем.Я уже установил upload_to и создал свой собственный класс FileSystemStorage , чтобы сохранить файл с уникальным именем ... однако ...

Эта настройкапозволяет мне загружать и сохранять файл с уникальным именем для каждого файла (что нормально), но мне также нужно, чтобы удалить предыдущий файл, который существовал, например,

Я загружаю файл1.png и он сохраняется как file1_xkdeujg.png (это просто случайная строка)

Затем я захожу в администратор django (используя интерфейс администратора django, так что нужно сделать это через модель) и меняю изображение для этого поля наfileNEW.png

Что должно произойти сейчас:

1) он сохраняет новый файл как fileNEW_fjewiejk.png (уникальная случайная строка при каждом сохранении изображения) - done

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

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Ответ пришел на аналогичный вопрос о StackOverflow ...

По сути, вы сохраняете исходное изображение в методе init , а затем проверяете, не изменилось ли оно до сохранения.

После сохранения удалите изображение, сохраненное в исходном пути к изображению.

См. И этот ответ (ответ Джоша - тот, который я использовал, и предпочитаю, поскольку он не попадает в базу данных).

Джанго: При сохранении, как вы можете проверить, изменилось ли поле?

0 голосов
/ 18 марта 2011

Если я правильно понимаю, если вы переименуете файл, файл будет дублирован, а не перемещен. Переопределение метода save для класса Page может получить доступ к старому экземпляру и экземпляру росы. http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

Все, что вам нужно сделать, это сохранить старое имя файла в переменной, после вызова super.save () вы можете os.system("rm "+path_to_file) в тех случаях, когда файл изменился. Это помогает?

...