创建新帐户时重新上传默认图像

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)