IntegrityError at /accounts/register/ NOT NULL 约束失败:accounts_profile.user_id

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

大家好 :) 我尝试在我的 application.The 中添加个人资料用户,目标是在创建帐户的同时创建个人资料。但是这个错误来了:

完整性错误 /accounts/register/ NOT NULL 约束失败: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')
...

如果得到 DoesNotExist at /accounts/register/ 用户匹配查询不存在。

然后改为这样做:

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():

            # Delete commit=False
            user = user_form.save()
            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)

变化:

user = user_form.save(commit=False)

至:
user = user_form.save()