在Django中保存文件前更改文件名
我有一段代码,用来在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 个回答
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
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'