Измените имя файла перед сохранением файла в Django - PullRequest
4 голосов
/ 06 ноября 2010

У меня есть следующий код для переименования моих файлов при загрузке в django admin (в models.py)

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join('directory/', filename)

class Archivo(models.Model):
    archivo = models.FileField(upload_to = get_file_path)

Это работает для меня, но я хочу передать каталог динамически, что-то вроде этого:

def get_file_path(instance, filename, directory_string_var):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join(directory_string_var, filename)

Если я это сделаю, я не смогу передать параметр (переменную) каталога в метод в параметре upload_to поля "archivo".

1 Ответ

9 голосов
/ 06 ноября 2010

Если ваша цель - не дать файлам заполнить заданный каталог (это вызывает беспокойство, поскольку в зависимости от файловой системы некоторые операции над каталогом со слишком большим количеством записей могут быть дорогостоящими), upload_to может содержать форматирование strftime, которое будет быть заменены датой / временем загрузки.

archivo = models.FileField(upload_to = 'path/%Y/%M/%D/')

Вы можете сохранить параметр в объекте экземпляра:

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join(instance.directory_string_var, filename)

class Archivo(models.Model):
    archivo = models.FileField(upload_to = get_file_path)
    directory_string_var = 'default_directory_string_var'
...