在Django中保存文件之前更改文件名

eos*_*s87 4 python django django-models django-admin

在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)
Run Code Online (Sandbox Code Playgroud)

这适用于我,但我想动态传递目录,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我无法将目录参数(变量)传递给"archivo"字段的upload_to选项中的方法.

Pau*_*ine 9

如果您的目标只是阻止文件填满给定目录(这是一个问题,因为根据文件系统,对包含太多条目的目录的某些操作可能很昂贵),upload_to可以包含strftime格式,它将被替换为上传的日期/时间.

archivo = models.FileField(upload_to = 'path/%Y/%M/%D/')
Run Code Online (Sandbox Code Playgroud)

您可以将参数存储在实例对象中:

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'
Run Code Online (Sandbox Code Playgroud)