I have an UpdateView
where the user can update/create their profile details. The details include the profile picture, bio, and gender. I want to be able to take the user's uploaded profile image, crop it, and then save it. However, in my current implementation it only saves the image to a path I specify and that's it.
I have tried to add a save method in my models view to resize the image, however, I get this error: 'Image' object has no attribute '_committed'
Here is my code:
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)