В django изменение имени файла загруженного файла

Можно ли изменить имя файла загруженного файла в django? Я искал, но не нашел ответа.

Мое требование – всякий раз, когда файл загружается, его имя файла должно быть изменено в следующем формате.

format = userid + transaction_uuid + file_extension 

Большое спасибо…

3 Solutions collect form web for “В django изменение имени файла загруженного файла”

Как вы загружаете файл? Я предполагаю, что с FileField .

В документации для FileField.upload_to указано, что поле upload_to ,

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

« instance »: экземпляр модели, в которой определяется FileField . Более конкретно, это конкретный экземпляр, в котором прикреплен текущий файл.

« filename »: имя файла, которое было первоначально предоставлено файлу. Это может быть или не быть принято во внимание при определении конечного пути назначения.

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

 def update_filename(instance, filename): path = "upload/path/" format = instance.userid + instance.transaction_uuid + instance.file_extension return os.path.join(path, format) 

Вы должны иметь FileField с upload_to который вызывает обратный вызов, см. [1]

Ваш обратный вызов должен вызывать метод-оболочку, который получает экземпляр как один из параметров и имени файла, как другой. [2]

Измените его так, как вам нравится, и верните новый путь [3]

1. ЛОГИКА

 FileField(..., upload_to=method_call(params),....) 

2. определить метод

 def method_call(params): return u'abc' 

3. Обертка:

 def wrapper(instance, filename): return method 

это метод рэпера, который вам нужен для получения экземпляра.

 def wrapper(instance, filename): ... Your logic ... return wrapper 

Полный код

 def path_and_rename(path, prefix): def wrapper(instance, filename): ext = filename.split('.')[-1] project = "pid_%s" % (instance.project.id,) # get filename if instance.pk: complaint_id = "cid_%s" % (instance.pk,) filename = '{}.{}.{}.{}'.format(prefix, project, complaint_id, ext) else: # set filename as random string random_id = "rid_%s" % (uuid4().hex,) filename = '{}.{}.{}.{}'.format(prefix, project, random_id, ext) # return the whole path to the file return os.path.join(path, filename) return wrapper 

Вызов метода

 sales_attach = models.FileField("Attachment", upload_to=path_and_rename("complaint_files", 'sales'), max_length=500, help_text="Browse a file") 

Надеюсь это поможет. Благодарю.

если вы хотите, чтобы ваша функция повторно использовалась:

 import hashlib import datetime import os from functools import partial def _update_filename(instance, filename, path): path = path filename = "..." return os.path.join(path, filename) def upload_to(path): return partial(_update_filename, path=path) 

Вам просто нужно использовать его так:

 document = models.FileField(upload_to=upload_to("my/path")) 
  • Использование request.user с Django ModelForm
  • Представление не возвратило объект HttpResponse. Вместо этого он вернул None
  • Добавление пользователей в группы в Django
  • Внешние запросы Django
  • Предоставление другой части шаблонов в соответствии с значениями запроса в Django
  • django - ошибка импорта: нет модуля с именем views
  • Отобразить таблицу объектов django
  • Проверка подлинности Django с пользовательской моделью с идентификатором электронной почты как уникальным ключом
  • Python - лучший язык программирования в мире.