我有一个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)
答案 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()