【问题标题】:Change filename before save file in Django在 Django 中保存文件之前更改文件名
【发布时间】:2010-11-05 22:19:25
【问题描述】:

在 django admin(在 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 选项中的方法。

【问题讨论】:

    标签: python django django-admin django-models


    【解决方案1】:

    如果您的目标只是阻止文件填满给定目录(这是一个问题,因为取决于文件系统,对具有太多条目的目录的某些操作可能会很昂贵),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'
    

    【讨论】:

    • 谢谢,将参数存储在实例中为我工作! :D
    • 介意在这里解释uuid吗?
    • @RishabhAgrahari 你可以忽略这个 - 这是一个非常古老的答案。这里的目标是为每次上传生成一个唯一的名称 - 我来自巴西,我们说葡萄牙语,有时人们会上传带有 unicode 或其他字符的文件,这可能会导致问题,所以我经常使用哈希或 UUID 而不是原来的姓名。我今天可能会使用settings.SOMETHING
    • 这似乎不适用于 Django 3.1.7(与原始答案相比,未来的方式)
    【解决方案2】:

    我是这样做的:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 2018-11-11
      • 2012-05-23
      • 1970-01-01
      • 2017-06-05
      • 2022-01-23
      • 1970-01-01
      • 2012-06-02
      相关资源
      最近更新 更多