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

问题描述 投票:0回答:3

我有下一个代码在 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
3个回答
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
投票

我是这样做的:

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

0
投票

如果您想在保存前重命名文件 - 更改“file_obj.file.name”值

class Model():
   file_obj = models.FileField(upload_to='etc/files', ...)

    def save(self, *args, **kwargs):
        self.file_obj.file.name = 'new_file_name'
        super().save(*args, **kwargs)

© www.soinside.com 2019 - 2024. All rights reserved.