Чтобы применить 'update_session_auth_hash' в UpdateView

произошла ошибка в приведенном ниже коде.

class UserUpdate(LoginRequiredMixin, UpdateView):
model = User
form_class = ProfileUpdateForm
template_name = 'single_pages/profile_update.html'
success_url = reverse_lazy('single_pages:landing')
login_url = '/login/'
def form_valid(self, form):
    u = form.save()
    if u is not None:
        update_session_auth_hash(self.request, u)
    return super(UserUpdate, self).form_valid(form)

с сообщением об ошибке

IntegrityError at /update/8/
UNIQUE constraint failed: single_pages_profile.phoneNumber
Request Method: POST
Request URL:    http://127.0.0.1:8000/update/8/
Django Version: 3.2.13
Exception Type: IntegrityError
Exception Value:    
UNIQUE constraint failed: single_pages_profile.phoneNumber
Exception Location: C:\github\project\venv\lib\site- 
packages\django\db\backends\sqlite3\base.py, line 423, in execute

Похоже, что это связано с моделью Profile, которая является OnetoOne с пользователем следующим образом:

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phoneNumberRegex = RegexValidator(regex = r'^01([0|1||6|7|8|9]-?([0-9]{3,4})-?([0-9]{4})$')
phoneNumber = models.CharField(max_length=11, unique=True, validators=[phoneNumberRegex])
username = models.CharField(max_length=30)
email = models.EmailField(max_length=50)
address = models.CharField(max_length=200)

Хотя я не хочу, чтобы Profile был ForeignKey пользователя, я попробовал это однажды, но произошла та же ошибка.

Последнее - это forms.py

class ProfileUpdateForm(UserCreationForm):
phoneNumber = forms.CharField(required=False)
address = forms.CharField(required=False)
username = forms.CharField()
email = forms.EmailField()
password1 = forms.CharField()
password2 = forms.CharField()

class Meta(UserCreationForm.Meta):
    fields = UserCreationForm.Meta.fields + ('email',)
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

    self.fields['username'].disabled = True


def save(self):
    user = super().save()
    profile = Profile.objects.create(
        user=user, phoneNumber=self.cleaned_data['phoneNumber'], address=self.cleaned_data['address'])
    return user

Судя по сообщению об ошибке, проблема здесь:

profile = Profile.objects.create(
        user=user, phoneNumber=self.cleaned_data['phoneNumber'], address=self.cleaned_data['address'])

Заранее благодарю за ответ.

Проблема не в update_session_auth_hash, а в том, что вы сохраняете форму дважды.

def form_valid(self, form):
    u = form.save()  #<-- Saving once
    if u is not None:
        update_session_auth_hash(self.request, u)
    return super(UserUpdate, self).form_valid(form)  # <-- Saving twice

Вместо этого, вы можете вернуться к url успеха на основе объекта позже. Например, так:

def form_valid(self, form):
    u = form.save()
    if u is not None:
        update_session_auth_hash(self.request, u)
    return HttpResponseRedirect(self.redirect_to(u))
Вернуться на верх