在Django模型中添加了图片字段,但上传时默认名称不变
我的 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不会覆盖同名的文件。这个问题可以通过使用自定义存储或者删除旧文件来解决。