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

Python 在Django中保存文件之前更改文件名,python,django,django-admin,django-models,Python,Django,Django Admin,Django Models,在django admin(models.py)中上载文件时,我有下一个重命名文件的代码 这对我很有用,但是我想动态传递目录,类似于: 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_v

在django admin(models.py)中上载文件时,我有下一个重命名文件的代码

这对我很有用,但是我想动态传递目录,类似于:

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)

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

如果您的目标只是防止文件填充给定目录(这是一个问题,因为根据文件系统的不同,对包含太多条目的目录执行某些操作可能会很昂贵),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'

谢谢,伙计,将参数存储在实例中为我工作!:DMind在这里解释
uuid
?@RishabhAgrahari您可以忽略这一点-这是一个非常古老的答案。这里的目标是为每次上传生成一个唯一的名称-我来自巴西,我们在那里说葡萄牙语,有时人们上传带有unicode或其他字符的文件,这可能会导致问题,因此我经常使用哈希或UUID来代替原始名称。我可能会在今天使用
设置。有些东西
。这似乎对Django 3.1.7不起作用(从最初的答案来看,这是未来的方式)
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'