Django -> 异常值:(1048,“列‘user_id’不能为空”)

Ala*_*gey 0 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})
Run Code Online (Sandbox Code Playgroud)

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

    new_user_profile = profileform.save()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Exception Type: IntegrityError
Exception Value: (1048, "Column 'user_id' cannot be null")
Run Code Online (Sandbox Code Playgroud)

我的配置文件模型如下:

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

    class Meta:
        managed = True
        db_table = 'fbf_profile'
Run Code Online (Sandbox Code Playgroud)

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

2ps*_*2ps 5

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

\n\n
new_user = form.save()\nprofile = profileform.save(commit=False)\nif profile.user_id is None:\n    profile.user_id = new_user.id\nprofile.save()\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n