在UpdateView中调整图像大小

时间:2019-01-31 04:30:40

标签: python django django-models django-views

我有一个UpdateView,用户可以在其中更新/创建其个人资料详细信息。详细信息包括个人资料图片,个人简介和性别。我希望能够获取用户上载的个人资料图片,将其裁剪,然后保存。但是,在我当前的实现中,它仅将图像保存到我指定的路径,就是这样。

我尝试在模型视图中添加保存方法以调整图像大小,但是,出现以下错误:'Image' object has no attribute '_committed'这是我的代码:

class Profile(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    user    = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    bio     = models.CharField(max_length=200, null=True)
    avatar  = models.ImageField(upload_to="img/path")
    gender  = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True)    

    def save(self, *args, **kwargs):
        if self.avatar:
            image = Image.open(self.avatar)

            self.avatar = image.resize((200, 200), Image.ANTIALIAS)
        super(Profile, self).save(*args, **kwargs)

UpdateView

class ProfileSettings(UpdateView):
    model = Profile
    template_name = 'profile/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('profile:settings')

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)

        if form.is_valid():
            bio = form.cleaned_data['bio']
            gender = form.cleaned_data['gender']
            avatar = form.cleaned_data['avatar']

            Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})

        return HttpResponseRedirect(self.success_url)

1 个答案:

答案 0 :(得分:2)

我认为您可以像这样更新保存方法:

def save(self, *args, **kwargs):
    super(Profile, self).save(*args, **kwargs)  
    if self.avatar:
       image = Image.open(self.avatar)
       height, width = image.size
       if height==200 and width==200:
           image.close()
           return
       image = image.resize((200, 200), Image.ANTIALIAS)
       image.save(self.avatar.path)
       image.close()