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