Django - >例外值:(1048,"列' user_id'不能为空")

时间:2017-01-14 12:28:07

标签: django django-models

我有以下观点,它完美无缺:

@transaction.atomic
def register(request):
    next_url = request.POST.get('next', request.GET.get('next', reverse('profile')))
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        profileform = ProfileForm(request.POST)
        if form.is_valid() and profileform.is_valid():
            new_user = form.save()

            # Login the newly created user.
            authenticated_user = authenticate(username=new_user.username,
                                              password=form.cleaned_data['password1'])
            login(request, authenticated_user)
            return redirect(next_url)
    else:
        form = RegistrationForm()
        profileform = ProfileForm()
    return render(request, 'meta/register.html', {'form': form, 'profileform': profileform, 'next': next_url})

但是,当我希望使用以下行保存其他配置文件信息时(位于new_user = form.save()行下面):

    new_user_profile = profileform.save()

我收到以下错误:

Exception Type: IntegrityError
Exception Value: (1048, "Column 'user_id' cannot be null")

我的个人资料模型如下:

class Profile(models.Model):
    user = models.OneToOneField(User)
    dob = models.DateField(max_length=8)

    class Meta:
        managed = True
        db_table = 'fbf_profile'

任何帮助都会很棒,艾伦。

2 个答案:

答案 0 :(得分:3)

使用这样的外键时,通常会看到commit=False的保存,然后手动设置模型上的外键。如,

new_user = form.save()
profile = profileform.save(commit=False)
if profile.user_id is None:
    profile.user_id = new_user.id
profile.save()
  

save()方法接受可选的commit关键字参数,该参数接受TrueFalse。如果使用save()调用commit=False,则会返回尚未保存到数据库的对象。在这种情况下,您可以在生成的模型实例上调用save()。如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则此选项非常有用。 <{1}}默认为commit

答案 1 :(得分:0)

显然,user中未设置ProfileForm字段。对于Profile user_iduser模型需要OneToOneField

ProfileForm将需要您必须设置的user字段,或者您必须在{{1}中手动设置user字段} save()的函数(然后你必须覆盖它)。