所以我一直在尝试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"。我错过了什么?
答案 0 :(得分:4)
问题是,当你执行users_form.save()
时,它实际上尝试在对象上创建,并将其保存到约束引发异常的数据库中。为避免这种情况,您可以使用commit=False
参数在内存中创建配置文件对象,但不会将其保存到数据库中。
userregister = users_form.save(commit=False)
userregister.user = user
userregister.save()
此
save()
方法接受可选的commit关键字参数 接受True或False。如果使用commit = False调用save(), 然后它将返回一个尚未保存到的对象 数据库。在这种情况下,您可以在结果上调用save()
模型实例。如果要进行自定义处理,这非常有用 保存之前的对象,或者如果要使用其中一个 专业的模型保存选项。默认情况下,commit为True。