Данные не сохраняются в модели профиля

При попытке зарегистрировать нового пользователя через форму регистрации поля номер телефона (phone_number) и идентификатор библиотеки (library_id) не сохраняются в базе данных. Несмотря на то, что эти поля включены в форму регистрации и корректно отображаются, отправленные значения не записываются в базу данных.

views.py

def user_register(request):
    userIsAuthenticated = False
    if request.user.is_authenticated:
        username1 = request.user.username
        userIsAuthenticated = True
    else:
        username1 = "N/A"
        userIsAuthenticated = False

    if request.method == 'GET':
            form = RegisterForm()
            return render(request, "register.html", {"form":form, "username": username1, "userIsAuthenticated": userIsAuthenticated})
    
    if request.method == 'POST':
        form = RegisterForm(request.POST) 
        if form.is_valid():
            user = form.save(commit=False)
            user.save()
            login(request, user)
            return render(request, "register-success.html")
        else:
            return render(request, 'register.html', {"form":form, "username": username1, "userIsAuthenticated": userIsAuthenticated})

forms.py

class RegisterForm(UserCreationForm):
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    library_id = forms.CharField(max_length=100)
    phone_number = forms.CharField(max_length=100)

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2']

    def save(self, commit=True):
        user = super().save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']
        if commit:
            Profile.objects.create(
                user=user,
                phone_number=self.cleaned_data['phone_number'],
                library_id=self.cleaned_data['library_id']
            )
            user.save()
        return user

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=100)
    library_id = models.CharField(max_length=100)

    def __str__(self):
        return self.user.username

signals.py

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Более подробная информация (процесс регистрации, проблема в деталях):

  1. заполните регистрационную форму Заполните форму регистрации на сайте
  2. давайте посмотрим на таблицу db
id username first_name last_name email
27 dolor Lorem ipsum sit@amet.consectetur

Остальные детали сохраняются в модели Profile. Давайте посмотрим на нее!

id user_id phone_number library_id
12 27 "" ""

Здесь данные из заполненной формы не сохраняются.

Кроме того, я могу заполнить эти поля (phone_number, library_id) с помощью панели администратора, так что проблема, скорее всего, в функции user_register.

Потому что логика сохранения информации в модели Profile зависит от commit=True в методе .save() вашей формы.

Но вы никогда не вызываете RegisterForm.save(commit=True), вы вызываете его только с помощью commit=False. Это означает, что Profile-логика никогда не выполняется. Причина, по которой вы вообще получаете объект Profile в базе данных, заключается в create_user_profile-сигнале.

    def save(self, commit=True):
        user = super().save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']
        if commit:     # <---- NB! Conditional execution only when commit=True
            Profile.objects.create(
                user=user,
                phone_number=self.cleaned_data['phone_number'],
                library_id=self.cleaned_data['library_id']
            )
            user.save()
        return user

def user_register(request):
    [...]

    if request.method == 'POST':
        form = RegisterForm(request.POST) 
        if form.is_valid():
            user = form.save(commit=False)  # <-- NB! commit=False

Есть много способов сделать это, но вам придется решить, как управлять логикой сохранения между вашей формой и вашей моделью(ями).

Вернуться на верх