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

5 投票
2 回答
11979 浏览
提问于 2025-04-16 06:38

我有一段代码,用来在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'

撰写回答