【问题标题】:How to prevent Django from changing file name when a file with that name already exists?当具有该名称的文件已经存在时,如何防止 Django 更改文件名?
【发布时间】:2012-03-02 03:53:38
【问题描述】:

在我的情况下,我允许用户上传头像图片并简单地使用 user_id 作为文件名。所以会有1.jpg、2.jpg等。

但是我发现如果我为某个已经上传了一个帐户的新头像上传了一个新头像,比如用户 #10,新文件将被命名为“10_1.jpg”。没关系,但是我不需要它,我希望新文件可以覆盖旧文件 - 无论如何它也可以节省一些磁盘空间。

我用谷歌搜索并搜索但找不到线索。我希望 ImageField 或 FileField 有一个选项,但它不存在。

感谢您的帮助!

【问题讨论】:

标签: django filefield imagefield


【解决方案1】:

您应该定义自己的存储,从 FileSystemStorage 继承它,并覆盖其中的 get_available_name 函数。将此存储用于您的图像域。 像这样的:

class OverwriteStorage(FileSystemStorage):

    def get_available_name(self, name):
        if self.exists(name):
            os.remove(os.path.join(SOME_PATH, name))
        return name

fs = OverwriteStorage(location=SOME_PATH)

class YourModel(models.Model):
    image_file = models.ImageField(storage=fs)

【讨论】:

  • 嘿伙计。我刚刚发现这是开始的正确位置,但是 get_available_name 不是覆盖的方法。我覆盖了_save,现在一切正常。
  • 所以你必须复制50行代码,这不是很好。这就是为什么最好覆盖 get_available_name
【解决方案2】:

Michael Gendin 的上述解决方案非常适用于 Django 2.1(2018 年您好!)。只需在“get_available_name”方法中添加“max_length”属性即可:

def get_available_name(self, name, max_length=None):

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2014-02-09
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多