在我的情况下,我允许用户上传头像图片并简单地使用user_id作为文件名。所以会有1.jpg,2.jpg等。
但是我发现如果我为已经上传过的一个帐户上传了一个新的头像,让我们说用户#10,新文件将被命名为“10_1.jpg”。这是可以的,但我不需要它,我希望新文件可以覆盖旧文件 - 它还可以节省一些磁盘空间。
我用Google搜索并搜索但找不到线索。我希望ImageField或FileField有一个选项,但它不存在。
感谢您的帮助!
答案 0 :(得分:12)
您应该定义自己的存储,从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)
答案 1 :(得分:1)
Michael Gendin的上述解决方案非常适合Django 2.1(您好,2018年开始!)。只需将“ max_length”属性添加到“ get_available_name”方法中:
def get_available_name(self, name, max_length=None):