我有以下观点,它完美无缺:
@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'
任何帮助都会很棒,艾伦。
答案 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
关键字参数,该参数接受True
或False
。如果使用save()
调用commit=False
,则会返回尚未保存到数据库的对象。在这种情况下,您可以在生成的模型实例上调用save()
。如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则此选项非常有用。 <{1}}默认为commit
。
答案 1 :(得分:0)
显然,user
中未设置ProfileForm
字段。对于Profile
user_id
,user
模型需要OneToOneField
。
ProfileForm
将需要您必须设置的user
字段,或者您必须在{{1}中手动设置user
字段} save()
的函数(然后你必须覆盖它)。