6

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

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

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

感谢帮助!

4

2 回答 2

14

您应该定义自己的存储,从 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)
于 2012-02-09T17:47:20.277 回答
2

Michael Gendin 的上述解决方案适用于 Django 2.1(Hello from 2018!)。只需将“max_length”属性添加到“get_available_name”方法:

def get_available_name(self, name, max_length=None):
于 2018-12-05T08:12:28.957 回答