当前位置: 首页 > 面试题库 >

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

万俟嘉珍
2023-03-14
问题内容

我的模型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

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



 类似资料:
  • 问题内容: 我想知道是否可以创建多个具有相似名称的文件,而不会覆盖当前文件。 例如:如果我有一个文件:下次创建时xyz.txt应该是:xyz(1).txt 因此,如果我重新运行该程序,则当前文件不会被覆盖。我已经尝试过,如果带有标志变量的条件将数字添加为文件名的前缀。 我想知道是否有任何Java命令来避免覆盖现有文件。 问题答案: 我想知道是否有任何本地Java命令停止覆盖[并将数字添加到文件名中

  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 问题内容: 我想要一个带有Real的compareTo方法(一个用于处理任意大而精确的实数的类[好吧,只要它现在的长度小于2 ^ 31])和一个带有一个对象,但是Java不允许我这样做,而且我还没有足够的经验来知道为什么。 我只是试图修改该类以实现Comparable,并且在下面得到了这些错误消息。我不是很明白错误消息的含义,但是我知道这与我试图为类制作的每个方法提供所有不同方法签名的灵活性的可怕

  • 我正在使用PDFBox和java生成pdf文档。该文档有几页文字和图像。每页的页眉和页脚都有相同的图像。目前,我正在创建一个新的PDImageXObject,并在每次添加新页面时使用该新对象调用drawImage()。生成的文档非常重,我认为是因为它包含同一图像的重复副本。 最有效的方法是什么?。最有可能的是,pdfbox有一种更好的方式来管理文档范围内的资源。我是pdfbox的新手,坦率地说,我

  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 问题内容: 我正在用C#编写.NET Framework 3.5。 我正在尝试将某些Json解析为JObject。 Json如下: 当我尝试将此Json解析为JObject时,JObject仅了解LargeBox。SmallBox和MedBox的信息丢失。显然,这是因为它将“ TBox”解释为一个属性,并且该属性已被覆盖。 我从Delphi编码的服务中收到此Json。我正在尝试为该服务创建C#代理