尝试创建寄存器视图时出现NOT NULL约束失败错误



所以我一直在尝试Django身份验证。我尝试创建一个寄存器视图,它实现了两个模型django.contrib.auth.models.User和一个与User共享OneToOne关系的自定义模型。

这是相关的代码

型号.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    SapID = models.IntegerField(default=60000000000)
    def __str__(self):
        return self.user.username

views.py

from django.shortcuts import render
from .forms import UserFormRegister, UserForm
# Create your views here.
def register(request):
    if request.method == 'POST':
        user_form = UserForm(data = request.POST)
        users_form = UserFormRegister(data = request.POST)
        if user_form.is_valid() and users_form.is_valid():
            user = user_form.save()
            user.set_password(user.password)
            user.save()
            userregister = users_form.save()
            userregister.user = user
            userregister.save()
            return redirect('/#/')
    else:
        user_form = UserForm()
        users_form = UserFormRegister()
    return render(request, 'register.html',{'user_form':user_form, 'users_form':users_form},) 

forms.py

from django import forms
from django.contrib.auth.models import User
from .models import UserProfile
class UserForm(forms.ModelForm):
    password = forms.CharField(widget = forms.PasswordInput())
    class Meta:
        model = User
        fields=('username','password','email','first_name','last_name',)
class UserFormRegister(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('SapID', )        

SapID是每个用户将拥有的唯一id。

现在,当我尝试注册时,用户对象会被创建,但用户配置文件对象不会。我收到一个错误,说"NOT NULL约束失败:foo_userprofile.user_id"。我缺少什么?

问题是,当您执行users_form.save()时,它实际上会尝试创建对象,并将其保存到约束引发异常的数据库中。为了避免这种情况,可以使用commit=False参数,该参数在内存中创建概要文件对象,但目前还不将其保存到数据库中。

userregister = users_form.save(commit=False)
userregister.user = user
userregister.save()

关于commit=False:的更多信息

save()方法接受一个可选的commit关键字参数,该参数接受True或False。如果在commit=False的情况下调用save(),然后它将返回一个尚未保存到数据库在这种情况下,由您对结果调用save()模型实例。如果您想对进行自定义处理,这很有用保存对象之前,或者如果要使用专用模型保存选项。commit默认为True。

最新更新