创建新帐户时重新上传默认图像
default image being reuploaded when new account created
在我的个人资料模型上,我有一个默认图像。但是我希望所有具有默认图像的帐户都将读取相同的图像,但是当创建新帐户时,default.jpg 正在重新上传到 s3 存储桶。
问题是由压缩功能引起的,如果我将其删除并保存代码,问题就会消失。
怎么能不重新保存default.jpg
def compress(image):
im = Image.open(image)
out_put_size = (300,300)
im.thumbnail(out_put_size)
# create a BytesIO object
im_io = BytesIO()
# save image to BytesIO object
im = im.resize([500,500])
#resize image
im = im.convert("RGB")
im = im.save(im_io,'JPEG', quality=75)
# create a django-friendly Files object
new_image = File(im_io, name=image.name)
return new_image
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, max_length=30)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
initial = self._state.adding
#image compression start
if self.image and initial:
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
#image compression end
super(Profile,self).save(*args, **kwargs)
感谢您提出新问题。 self.image
总是会评估为 True
因为您设置了默认图像。默认情况下,它永远不会为空。因此调用了压缩函数。
您需要检查实例头像的名称属性是否与默认值不同。您可以使用 get_field()
元选项获取字段,并使用 get_default()
.
找到默认字段值
因此,用于比较实例图像名称的完整值将是 Profile._meta.get_field('avatar').get_default()
。
您可以将其分解为多个变量以提高可读性,或者将 Profile 替换为 self.__class__
。
def save(self, *args, **kwargs):
initial = self._state.adding
avatar_field = Profile._meta.get_field('avatar')
default_image_name = avatar_field.get_default()
no_default_image = self.avatar.name != default_image_name
#image compression start
if no_default_image and initial:
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
#image compression end
super(Profile,self).save(*args, **kwargs)
在我的个人资料模型上,我有一个默认图像。但是我希望所有具有默认图像的帐户都将读取相同的图像,但是当创建新帐户时,default.jpg 正在重新上传到 s3 存储桶。
问题是由压缩功能引起的,如果我将其删除并保存代码,问题就会消失。
怎么能不重新保存default.jpg
def compress(image):
im = Image.open(image)
out_put_size = (300,300)
im.thumbnail(out_put_size)
# create a BytesIO object
im_io = BytesIO()
# save image to BytesIO object
im = im.resize([500,500])
#resize image
im = im.convert("RGB")
im = im.save(im_io,'JPEG', quality=75)
# create a django-friendly Files object
new_image = File(im_io, name=image.name)
return new_image
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, max_length=30)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
initial = self._state.adding
#image compression start
if self.image and initial:
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
#image compression end
super(Profile,self).save(*args, **kwargs)
感谢您提出新问题。 self.image
总是会评估为 True
因为您设置了默认图像。默认情况下,它永远不会为空。因此调用了压缩函数。
您需要检查实例头像的名称属性是否与默认值不同。您可以使用 get_field()
元选项获取字段,并使用 get_default()
.
因此,用于比较实例图像名称的完整值将是 Profile._meta.get_field('avatar').get_default()
。
您可以将其分解为多个变量以提高可读性,或者将 Profile 替换为 self.__class__
。
def save(self, *args, **kwargs):
initial = self._state.adding
avatar_field = Profile._meta.get_field('avatar')
default_image_name = avatar_field.get_default()
no_default_image = self.avatar.name != default_image_name
#image compression start
if no_default_image and initial:
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
#image compression end
super(Profile,self).save(*args, **kwargs)