在Django模型中添加了图片字段,但上传时默认名称不变

0 投票
2 回答
928 浏览
提问于 2025-04-18 09:39

我的 model.py 文件如下:

 class Employee(models.Model):
    id = models.IntegerField(max_length = 6,primary_key=True,verbose_name="Employee ID")
    name = models.CharField(max_length = 100,verbose_name="Name")
    image = models.ImageField(upload_to = ".",blank=True,null=True)

当我尝试在 Django 管理后台添加图片时,它会把图片上传到 /site_media/media 这个地方。我想把上传的图片名称替换成我的主键字段 ID.jpeg,这样我就可以在 HTML 页面中获取并显示这个图片。

现在我可以获取到图片名称,因为它存储在数据库里。不过为了简化操作,我需要在上传之前自定义图片名称。而且如果用户为同一个人上传了另一张图片,它应该覆盖掉旧的那张。目前的情况是,数据库里只更新了新的名称,但旧的图片仍然保留在媒体文件夹里。

2 个回答

1

你可以为 upload_to 使用一个函数;

def sample_upload_to_function(instance, filename):
    extension = filename.split('.')[-1]
    return "%s.%s" %(instance.id, extension)

class Employee(models.Model):
    .....
    image = models.ImageField(upload_to =sample_upload_to_function, blank=True, null=True)

但是我不知道怎么覆盖已经存在的文件。我觉得在保存之前,你必须先删除已经存在的文件。

1

你可以像下面这样使用一个可调用对象来设置 upload_to

def file(self, filename):
    url = "./%d.JPG" % (self.id,)
    return url

class Employee(models.Model):
    id = models.IntegerField(max_length = 6,primary_key=True,verbose_name="Employee ID")
    name = models.CharField(max_length = 100,verbose_name="Name")
    image = models.ImageField(upload_to = file,blank=True,null=True)

不过,你会遇到一个问题,就是Django不会覆盖同名的文件。这个问题可以通过使用自定义存储或者删除旧文件来解决。

撰写回答