Как запретить Django изменять имя файла, если файл с таким именем уже существует? - PullRequest
6 голосов
/ 09 февраля 2012

В моем случае я разрешаю пользователю загружать аватарку и просто использовать user_id в качестве имени файла.Таким образом, будет 1.jpg, 2.jpg и т. Д.

Однако я обнаружил, что если я загружу новый аватар для какой-то учетной записи, которая уже загружена, скажем, пользователь # 10, новый файл будет названкак "10_1.jpg".Это нормально, но мне это не нужно, и я надеюсь, что новый файл может перезаписать старый - в любом случае он также экономит место на диске.

Я гуглил и искал, но не смог найти подсказку.Я надеялся, что будет опция для ImageField или FileField, но ее там нет.

Спасибо за помощь!

Ответы [ 2 ]

12 голосов
/ 09 февраля 2012

Вы должны определить свое собственное хранилище, наследовать его от FileSystemStorage и переопределить в нем функцию get_available_name.Используйте это хранилище для вашего поля изображения.Как то так:

class OverwriteStorage(FileSystemStorage):

    def get_available_name(self, name):
        if self.exists(name):
            os.remove(os.path.join(SOME_PATH, name))
        return name

fs = OverwriteStorage(location=SOME_PATH)

class YourModel(models.Model):
    image_file = models.ImageField(storage=fs)
1 голос
/ 05 декабря 2018

Приведенное выше решение Майкла Джендина прекрасно работает для Django 2.1 (привет с 2018 года!) Необходимо только добавить атрибут «max_length» в метод «get_available_name»:

def get_available_name(self, name, max_length=None):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...