Изменить размер изображений Django после загрузки

У меня есть модель

upload_path = 'images'
upload_path_to_resize = 'images/resized'


class Images(models.Model):
    image = models.ImageField(upload_to=upload_path, blank=True, null=True)
    image_url = models.URLField(blank=True, null=True)
    image_resized = models.ImageField(upload_to=upload_path_to_resize,blank=True)
    width = models.PositiveIntegerField(null=True)
    heigth = models.PositiveIntegerField(null=True)

    def clean(self):
        if (self.image == None and self.image_url == None ) or (self.image != None and self.image_url != None ):
            raise ValidationError('Empty or both blanked')

    def get_absolute_url(self):
        return reverse('image_edit', args=[str(self.id)])

    def save(self):
        if self.image_url and not self.image:
            name = str(self.image_url).split('/')[-1]
            img = NamedTemporaryFile(delete=True)
            img.write(urlopen(self.image_url).read())
            img.flush()
            self.image.save(name, File(img))
            self.image_url = None
        super(Images, self).save()

    def resize(self, *args, **kwargs):
        super().save(*args, **kwargs)
        SIZE = self.width, self.heigth)
        if self.width != None or self.heigth !=None:
        pic = Image.open(self.image.path)
        pic.thumbnail(SIZE, Image.LANCZOS)
        pic.save(self.image_resized.path)

Метод изменения размера должен взять существующий файл из поля «ImageField», изменить его размер и загрузить в поле «image_resized», но по какой-то причине форма ResizedForm передает аргументы высоты и ширины модели, но ничего не происходит.

from django.forms import ModelForm
from .models import Images

class ImageForm(ModelForm):
    class Meta:
        model = Images
        fields = ['image', 'image_url']

class ResizedForm(ModelForm):
    class Meta:
        model = Images
        fields = ['width', 'heigth']

Что мне нужно сделать, чтобы изменение размера работало правильно? Я уверен, что где-то я сделал что-то не так


Ответы (1 шт):

Автор решения: Andrey Maslov

наверное как-то так

 def save(self):
    if self.image_url and not self.image:
        name = str(self.image_url).split('/')[-1]
        img = NamedTemporaryFile(delete=True)
        img.write(urlopen(self.image_url).read())
        img.flush()
        self.image.save(name, File(img))
        self.image_url = None
    if self.image and not self.image_resized:
        self.resize()
    return super(Images, self).save()

    def resize(self):
        if self.width and self.heigth:
            import os # лучше вынести этот импорт в начало файла
            original_name, original_ext = os.path.splitext(self.image.name)
            new_file_name = '{}_resized{}'.format(original_name, original_ext)
            new_size = self.width, self.heigth
            pic = Image.open(self.image.path)
            pic.thumbnail(new_size, Image.LANCZOS)
            pic.save(new_file_name)
            self.resized_image.name = os.path.basename(new_file_name)
→ Ссылка