2010-11-05 8 views
3

У меня есть следующий код, чтобы переименовать свои файлы при загрузке в Джанго администратора (в models.py)Изменить имя файла перед сохранением файла в Django

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».

ответ

7

Если ваша цель заключается в том, чтобы файлы не заполняли данный каталог (это связано с тем, что в зависимости от файловой системы некоторые операции над каталогом со слишком большим количеством записей могут быть дорогими), 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' 
+1

благодаря человеку, сохранять параметры в работе экземпляра для меня! : D – eos87

Смежные вопросы