Вам нужно иметь FileField
с upload_to
, который вызывает обратный вызов, см. [1]
Ваш обратный вызов должен вызывать метод-обертку, который получает экземпляр в качестве одного из параметров и имя файла в качестве другого. [2]
Измените его так, как вам нравится, и верните новый путь [3]
1. LOGIC
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")
Надеюсь, это поможет.
Спасибо.