ImageField覆盖具有相同名称的图像文件

我的模型UserProfile与现场avatar = models.ImageField(upload_to=upload_avatar)

upload_avatar函数根据图像文件名命名user.id

但是,当用户更新头像时,新的头像名称与旧的头像名称一致,并且Django在文件名中添加后缀。

有办法覆盖文件而不是创建新文件吗?

回答:

是的,这对我也很重要。这就是我所做的。

模型:

from app.storage import OverwriteStorage

class Thing(models.Model):

image = models.ImageField(max_length=SOME_CONST, storage=OverwriteStorage(), upload_to=image_path)

还定义在models.py中:

def image_path(instance, filename):

return os.path.join('some_dir', str(instance.some_identifier), 'filename.ext')

在另一个文件中,storage.py

from django.core.files.storage import FileSystemStorage

from django.conf import settings

import os

class OverwriteStorage(FileSystemStorage):

def get_available_name(self, name):

"""Returns a filename that's free on the target storage system, and

available for new content to be written to.

Found at http://djangosnippets.org/snippets/976/

This file storage solves overwrite on upload problem. Another

proposed solution was to override the save method on the model

like so (from https://code.djangoproject.com/ticket/11663):

def save(self, *args, **kwargs):

try:

this = MyModelName.objects.get(id=self.id)

if this.MyImageFieldName != self.MyImageFieldName:

this.MyImageFieldName.delete()

except: pass

super(MyModelName, self).save(*args, **kwargs)

"""

# If the filename already exists, remove it as if it was a true file system

if self.exists(name):

os.remove(os.path.join(settings.MEDIA_ROOT, name))

return name

显然,这些是这里的示例值,但是总体而言,这对我来说效果很好,并且根据需要进行修改应该非常简单。

以上是 ImageField覆盖具有相同名称的图像文件 的全部内容, 来源链接: utcz.com/qa/419526.html

回到顶部