IntegrityError at /accounts/register/ NOT NULL constraint failed: accounts_profile.user_id

Привет всем :) Я пытаюсь добавить профиль пользователя в моем приложении.Цель состоит в том, чтобы создать профиль в то же время, когда мы создаем учетную запись. Но появляется эта ошибка :

IntegrityError at /accounts/register/ NOT NULL constraint failed: accounts_profile.user_id. Я не понимаю, в чем проблема с моим кодом, потому что я следовал учебнику youtube, где этот код работает...

вот мой код :

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from .forms import UserForm, ProfileForm
# Create your views here.

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        profile_form= ProfileForm(request.POST)

        if form.is_valid()  and profile_form.is_valid():
            user = form.save(commit=False)

            profile = profile_form.save(commit=False)
            profile.user = user

            user.save()
            profile.save()

            return redirect('account:login')

    else:
        form = UserCreationForm()
        profile_form = ProfileForm()


    context = {
     'form' : form ,
     'profile': profile_form,
    }

    return render(request, 'accounts/register.html', context)

models.py :

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    birthday = models.DateField()
    mail = models.EmailField(max_length=254, null = True, blank = True)


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

forms.py :

from django import forms
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth.models import User
from .models import Profile

class LoginForm(AuthenticationForm):
    username= forms.CharField(label='Username', widget=forms.TextInput(attrs={'class':'form-control',
    }))
    password= forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'class':'form-control',
    }))


class UserForm(UserCreationForm):
    class Meta :
        model = User
        fields =('username','password1', 'password2')

class ProfileForm(forms.ModelForm):
    birthday= forms.DateField(label='birthday',widget=forms.DateInput(attrs={
    'class':'form-control',
    'type' :'date',
    }))

    class Meta :
        model = Profile
        fields =('birthday', 'mail')

Попытка:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from .forms import UserForm, ProfileForm
# Create your views here.

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        profile_form= ProfileForm(request.POST)

        if form.is_valid()  and profile_form.is_valid():
            user = form.save(commit=False)
            user.save()

            profile = profile_form.save(commit=False)
            profile.user = user

            profile.save()

            return redirect('account:login')

    else:
        form = UserCreationForm()
        profile_form = ProfileForm()


    context = {
     'form' : form ,
     'profile': profile_form,
    }

    return render(request, 'accounts/register.html', context)

В вашем views.py вы создаете объект Profile и присваиваете ему пользователя, прежде чем сохранить объект User

Попробуйте это:

...

if form.is_valid()  and profile_form.is_valid():

            user = form.save()
            
            profile = profile_form.save(commit=False)
            profile.user = user
            profile.save()

            return redirect('account:login')
...

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