Повторная загрузка изображения по умолчанию при создании новой учетной записи
В моей модели профиля есть изображение по умолчанию. Однако я ожидал, что все учетные записи, имеющие изображение по умолчанию, будут читать одно и то же изображение, но когда создается новая учетная запись, файл 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, потому что вы установили изображение по умолчанию. По умолчанию оно никогда не будет нулевым. Следовательно, вызывается функция сжатия.
Необходимо проверить, отличается ли атрибут name аватара экземпляра от значения по умолчанию. Вы можете получить поле с помощью мета-опции 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)