def edit_profile(request): title = 'Edit profile' if request.method == "POST": # request.user.username is the original username form = EditProfileForm(request.user.username, request.POST, request.FILES) if form.is_valid(): username = form.cleaned_data["username"] phone_number = form.cleaned_data["phone_number"] location = form.cleaned_data["location"] profile_image = form.cleaned_data["profile_image"] user = get_object_or_404(User, id=request.user.id) # We use a transaction so that if one of the requests below fails all previous ones are canceled try: with transaction.atomic(): edit = Profile.objects.filter(user=user) if edit.exists(): edit = Profile.objects.get(user=user) edit.phone_number = phone_number edit.location = location if profile_image: edit.profile_image = request.FILES['profile_image'] edit.save() user.username = username user.save() else: edit = Profile(user=user) edit.phone_number = phone_number edit.location = location edit.profile_image = profile_image user.username = username edit.save() user.save() messages.add_message(request, messages.SUCCESS, 'Your changes have been saved.') return redirect('users:profile', username=user.username) except IntegrityError: form.errors[ 'internal'] = "An internal error has occurred. Please try your request again." else: edit = Profile.objects.filter(user=request.user) if edit.exists(): form = EditProfileForm( request.user.username, { 'username': request.user.username, 'phone_number': edit[0].phone_number, 'location': edit[0].location }, request.FILES) else: form = EditProfileForm(request.user.username, {'username': request.user.username}, request.FILES) return render(request, 'users/edit_profile.html', { 'title': title, 'form': form })