【问题标题】:NOT NULL constraint failed error on trying to create a register view尝试创建寄存器视图时出现 NOT NULL 约束失败错误
【发布时间】:2016-03-31 16:48:20
【问题描述】:

所以我一直在尝试 Django 身份验证。我尝试创建一个注册视图,它实现了两个模型 django.contrib.auth.models.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”。我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    More on commit=False:

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

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多