名称“InMemoryUploadedFile”未在 django 模型中定义?

时间:2021-02-18 04:26:58

标签: django django-models python-imaging-library

所以基本上我有一个 django 模型,它有一个文件字段。我想调整提交的图像的大小,我在这里有这段代码

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 是主要问题。谢谢!

2 个答案:

答案 0 :(得分:1)

您是否导入了 InMemoryUploadedFile?

请先导入

from django.core.files.uploadedfile import InMemoryUploadedFile

答案 1 :(得分:1)

您不需要使用 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)