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

时间:2015-12-25 21:00:46

标签: python django django-models django-admin django-views

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

这是相关代码

models.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"。我错过了什么?

1 个答案:

答案 0 :(得分:4)

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

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

More on commit=False

  

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