代码之家  ›  专栏  ›  技术社区  ›  eos87

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

  •  4
  • eos87  · 技术社区  · 15 年前

    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选项中的方法。

    1 回复  |  直到 15 年前
        1
  •  9
  •   Paulo Scardine    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'
    
    推荐文章