2012-02-09 7 views
6

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

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

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

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

+0

Посмотрите здесь: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo

ответ

10

Вы должны определить собственное хранилище, наследовать его из 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) 
+0

Эй человек. Я просто нашел, что это подходящее место для начала, но 'get_available_name' не является методом переопределения. Я переопределяю '_save', и теперь все работает. – x1a0

+0

Итак, вам нужно скопировать 50 строк кода, что не очень хорошо. Вот почему лучше переопределить get_available_name –

+0

См. Этот вопрос http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes# вкладка-топ – jdcaballerov