имя ‘InMemoryUploadedFile’ не определено в модели django?

#django #django-models #python-imaging-library

#django #django-модели #python-imaging-library

Вопрос:

Итак, в основном у меня есть модель django, в которой есть filefield. Я хотел бы изменить размер отправляемых изображений, и для этого у меня есть этот код

 def save(self, *args, **kwargs):
    img = Image.open(self.media)

    output = BytesIO()

    original_width, original_height = img.size
    aspect_ratio = round(original_width / original_height)
    desired_height = 100
    desired_width = desired_height * aspect_ratio

    img = img.resize((desired_width, desired_height))

    img.save(output, format='JPEG', quality=90)
    output.seek(0)

    self.image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % self.image.name.split('.')[0], 'image/jpeg', sys.getsizeof(output), None)

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

Я получаю сообщение об ошибке: «имя’InMemoryUploadedFile’ не определено». Как мне это исправить? Также побочный вопрос. Модель также принимает видео. Как мне изменить размер видео? Это просто побочный вопрос, основной вопрос — InMemoryUploaded. Спасибо!

Ответ №1:

вы импортировали InMemoryUploadedFile?

пожалуйста, сначала импортируйте его

 from django.core.files.uploadedfile import InMemoryUploadedFile
 

Комментарии:

1. Я не знал, что это было важно. Я немного покопался в документации Django и сказал, что это был класс, поэтому я подумал, что мне нужно его создать, но поскольку я никогда не работал с этим раньше, я был потерян

Ответ №2:

Вам не нужно использовать InMemoryUploadedFile для сохранения файла. Также вы получаете сообщение об ошибке, потому что вы никогда не импортируете его. Чтобы импортировать его from django.core.files import InMemoryUploadedFile . Вместо этого вам лучше использовать ContentFile :

 from django.core.files.base import ContentFile

...
def save(self, *args, **kwargs):
    img = Image.open(self.media)

    output = BytesIO()

    original_width, original_height = img.size
    aspect_ratio = round(original_width / original_height)
    desired_height = 100
    desired_width = desired_height * aspect_ratio

    img = img.resize((desired_width, desired_height))

    img.save(output, format='JPEG', quality=90)
    output.seek(0)
    
    self.image.save("%s.jpg" % self.image.name.split('.')[0], ContentFile(output), save=False)
    super(Post, self).save(*args, **kwargs)