AttributeError: тип объекта «_io.StringIO» не имеет атрибута «StringIO» - PullRequest
0 голосов
/ 21 сентября 2018

В моей модели я хочу отформатировать поле изображения, переопределив метод сохранения

Я сделал это в моей модели

from PIL import Image as Img
from io import StringIO
from django.core.files.uploadedfile import InMemoryUploadedFile


class Blog(models.Model):
    Blog_image= models.ImageField(upload_to="...", blank=True)

    def save(self, *args, **kwargs):
    if self.Blog_image:
        image = Img.open(StringIO.StringIO(self.Blog_image.read()))
        image.thumbnail((900,300), Img.ANTIALIAS)
        output = StringIO.StringIO()
        image.save(output, format='JPEG', quality=150)
        output.seek(0)
        self.Blog_image = InMemoryUploadedFile(output,'ImageField', "%s.jpg" %self.Blog_image.name, 'image/jpeg', output.len, None)
    super(Blog, self).save(*args, **kwargs)

Но получаю эту ошибку атрибута

AttributeError : type object '_io.StringIO' has no attribute 'StringIO'

Может кто-нибудь объяснить мне, почему я получаю эту ошибку ???

Моя версия Python - 3.6.4

Моя версия Django - 2.0.7

1 Ответ

0 голосов
/ 21 сентября 2018

Получил решение

работает на Pyhton 3.6.2, но я не знаю, где он был сохранен, и он вызывает из какой папки

from PIL import Image
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import sys

    def save(self, *args, **kwargs):
    imageTemproary = Image.open(self.Blog_image)
    outputIoStream = BytesIO()
    imageTemproaryResized = imageTemproary.resize( (900,300) ) 
    imageTemproaryResized.save(outputIoStream , format='JPEG', quality=150)
    outputIoStream.seek(0)
    self.Blog_image = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" %self.Blog_image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)
    super(Blog, self).save(*args, **kwargs)

Сделал это с помощью BytesIO и он работал нормально

...