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

5

我有以下代码用于在Django管理界面上传文件时重命名文件(在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)

这对我有用,但我希望能够动态传递目录,类似于这样:
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选项中的方法。
2个回答

13

如果您的目标只是防止文件填满给定的目录(这是一个问题,因为根据文件系统,针对包含太多条目的目录执行某些操作可能会很昂贵),则 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
能否解释一下这里的 uuid 是什么意思? - Rishabh Agrahari
1
@RishabhAgrahari 您可以忽略此内容 - 这是一个非常旧的答案。这里的目标是为每个上传生成一个唯一的名称 - 我来自葡萄牙语国家巴西,有时人们会上传带有Unicode或其他字符的文件,在未来可能会引起问题,因此我经常使用哈希或UUID代替原始名称。今天我可能会使用settings.SOMETHING - Paulo Scardine
这似乎不适用于 Django 3.1.7(比原始答案的时间更遥远)。 - Harlin

1
我这样做:
import uuid
import os

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename_start = filename.replace('.'+ext,'')

    filename = "%s__%s.%s" % (uuid.uuid4(),filename_start, ext)
    return os.path.join('FolderPath', filename)

class Blast_Email(models.Model):
    file    = models.FileField(upload_to=get_file_path,verbose_name=(u'File'))
    ### your other columns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接