Повторная загрузка изображения при обновлении объекта

В моей модели записи блога я переопределяю метод сохранения, чтобы вызвать функцию для сжатия загружаемого изображения. Это работает, как и ожидалось. Однако когда я использую представление обновления и вношу изменения в пост, изображение повторно загружается в ведро s3 и заменяет исходное изображение в модели.

Если я удалю весь код из функции compress и просто заставлю ее возвращать изображение, при использовании представления update она не загружает изображение заново.

Как предотвратить повторную загрузку изображения при просмотре обновлений.

модель:

    def compress(image):
    
    img = Image.open(image)
    img = img.convert("RGB")

    (w, h) = img.size   # current size (width, height)
    if w > 2000:
        new_size = (w//2, h//2)  # new size
        img = img.resize(new_size, Image.ANTIALIAS)
        (w, h) = img.size
        if w > 2000:
            new_size = (w//2, h//2)  # new size
            img = img.resize(new_size, Image.ANTIALIAS)

    im_io = BytesIO() 
    img.save(im_io, 'JPEG', quality=70, optimize=True) 

    new_image = File(im_io, name=image.name)

    return new_image


class Post(models.Model):
    image = models.ImageField(storage=PublicMediaStorage(), upload_to=path_and_rename, validators=[validate_image])
    ....


    def save(self, *args, **kwargs): 
        self.slug = slugify(self.title)

        if self.image:
            # call the compress function
            new_image = compress(self.image)
            # set self.image to new_image
            self.image = new_image

        super(Post,self).save(*args, **kwargs)

view:

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    form_class = PostFormUpdate
    template_name = 'blog/update_post.html'
   
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user.id == post.author_id:
            return True
        return False

enter image description here

self._state.adding можно использовать для проверки, является ли это начальным вызовом save().

def save(self, *args, **kwargs): 
    self.slug = slugify(self.title)
    initial = self._state.adding

    if self.image and initial:
        # call the compress function
        new_image = compress(self.image)
        # set self.image to new_image
        self.image = new_image

    super(Post,self).save(*args, **kwargs)
Вернуться на верх