Сохранение изображений с пикселями в django

#python #django #image #file-upload #image-resizing

#python #django #изображение #загрузка файла #изменение размера изображения

Вопрос:

Я хочу сохранять изображения с определенными пикселями, когда кто-то загружает изображение в модели django, его размер будет изменен, а затем сохранен в соответствии с идентификатором. Я хочу, чтобы они были сохранены в пути product / medium / id. Я попытался определить в нем путь, который сохраняет изображение, но не по тому пути, который я хочу.

Вот мой models.py

 class Product(models.Model):
product_name = models.CharField(max_length=100)
product_description = models.TextField(default=None, blank=False, null=False)
product_short_description = models.TextField(default=None,blank=False,null=False,max_length=120)
product_manufacturer = models.CharField(choices=MANUFACTURER,max_length=20,default=None,blank=True)
product_material = models.CharField(choices=MATERIALS,max_length=20,default=None,blank=True)
No_of_days_for_delivery = models.IntegerField(default=0)
product_medium = models.ImageField(upload_to='product/id/medium',null=True,blank=True)

def save(self, *args, **kwargs):
    self.slug = slugify(self.product_name)
    super(Product, self).save(*args, **kwargs)
  

Теперь я хочу изменить размер изображения, получить его идентификатор и сохранить в path product/medium/id/image.jpg

Ответ №1:

 from PIL import Image
import StringIO
import os
from django.core.files.uploadedfile import InMemoryUploadedFile


class Product(models.Model):
    pass  # your model description

    def save(self, *args, **kwargs):
        """Override model save."""
        if self.product_medium:
            img = Image.open(self.image)
            size = (500, 600) # new size
            image = img.resize(size, Image.ANTIALIAS) #transformation
            try:
                path, full_name = os.path.split(self.product_medium.name)
                name, ext = os.path.splitext(full_name)
                ext = ext[1:]
            except ValueError:
                return super(Product, self).save(*args, **kwargs)
            thumb_io = StringIO.StringIO()
            if ext == 'jpg':
                ext = 'jpeg'
            image.save(thumb_io, ext)

            # Add the in-memory file to special Django class.
            resized_file = InMemoryUploadedFile(
                thumb_io,
                None,
                name,
                'image/jpeg',
                thumb_io.len,
                None)

            # Saving image_thumb to particular field.
            self.product_medium.save(name, resized_file, save=False)

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