【问题标题】:Thumbnail for ImageField in django model, override savedjango模型中ImageField的缩略图,覆盖保存
【发布时间】:2017-03-24 19:20:16
【问题描述】:

我正在尝试从 ImageField 创建一个缩略图并将其保存到我的模型中。我以此为参考:http://www.yilmazhuseyin.com/blog/dev/create-thumbnails-imagefield-django/

文件已正确创建,我没有收到任何错误,但字段未保存在模型中。 我想我可以在保存方法中搞砸事情。我做错了什么?

这是我的代码:

def get_avatar_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'avatars/{0}/{1}'.format(instance.id, filename)


class User(AbstractUser):
    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_('Name of User'), blank=True, max_length=255)
    avatar = models.ImageField(upload_to=get_avatar_path, blank=True)
    small_avatar = models.ImageField(upload_to=get_avatar_path,
                                     blank=True)

    def create_thumbnail(self):
        # If there is no image associated with this.
        # do not create thumbnail
        if not self.avatar:
            return

        # Set our max thumbnail size in a tuple (max width, max height)
        THUMBNAIL_SIZE = (200, 200)

        DJANGO_TYPE = self.avatar.file.content_type
        print DJANGO_TYPE

        if DJANGO_TYPE == 'image/jpeg':
            PIL_TYPE = 'jpeg'
            FILE_EXTENSION = 'jpg'
        elif DJANGO_TYPE == 'image/png':
            PIL_TYPE = 'png'
            FILE_EXTENSION = 'png'
        elif DJANGO_TYPE == 'image/gif':
            PIL_TYPE = 'gif'
            FILE_EXTENSION = 'gif'

        # Open original photo which we want to thumbnail using PIL's Image
        image = Image.open(StringIO(self.avatar.read()))

        # use our PIL Image object to create the thumbnail, which already
        image.thumbnail(THUMBNAIL_SIZE, Image.ANTIALIAS)

        # Save the thumbnail
        temp_handle = StringIO()
        image.save(temp_handle, PIL_TYPE)
        temp_handle.seek(0)

        # Save image to a SimpleUploadedFile which can be saved into ImageField
        print os.path.split(self.avatar.name)[-1]
        suf = SimpleUploadedFile(os.path.split(self.avatar.name)[-1],
                                 temp_handle.read(), content_type=DJANGO_TYPE)
        # Save SimpleUploadedFile into image field
        print os.path.splitext(suf.name)[0]
        self.small_avatar.save(
            '%s_thumbnail.%s' % (os.path.splitext(suf.name)[0], FILE_EXTENSION),
            suf, save=False)

    def save(self, *args, **kwargs):
        self.create_thumbnail()
        super(User, self).save()

【问题讨论】:

  • 您的意思是在文件夹中创建了文件,但记录没有保存在数据库中?
  • 是的,完全正确。两个字段:avatar 和 small_avatar 都是空的。
  • 代码没有问题。它肯定会保存avatarsmall_avatarfields are not saved in model 是什么意思?

标签: python django python-imaging-library


【解决方案1】:

感谢您的反馈。抱歉新手问题,我是初学者。 问题似乎可以通过使缓存失效、重新启动 IDE 和服务来解决。 我认为上面的代码应该保留,因为网络上的一些解决方案已经过时了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多