Чтобы применить '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))