问题描述
我有一个视图,可以在其中收集用户数据并将其保存到后端。
def register(request):
if request.method == 'POST':
form = UserSignUpForm(request.POST)
if form.is_valid():
form.save()
print("REQUEST",request.user)
request.session['user'] = request.user.id
return redirect('additional_info')
else:
form = UserSignUpForm()
return render(request,'users/signup.html',{'form': form})
一旦完成,我会将用户重定向到另一个页面,在那里他们可以以另一种形式为其个人资料提供其他信息,例如他们的 dob、个人资料图片等。
这对视图使用以下代码:
def additionalInfo(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
user = request.session.get('user')
if form.is_valid():
profile = Profile()
profile.dob = request.POST.get('dob')
profile.User = user
profile.save()
return redirect('app-home')
else:
form = ProfileForm()
return render(request,'users/addInfo.html',{'form': form})
问题是当我尝试保存第二个表单时出现异常:
NOT NULL constraint failed: users_profile.user_id
我猜这是因为我在我的 Profile
模型中定义了这个:
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
意味着我需要提供我想要为其创建此 user
的 profile
。我如何获取刚刚使用 user
视图注册的 register
的信息并使其在 additionalInfo
视图中可用?
解决方法
您可以将用户 ID 保存为会话变量并在另一个视图中选取。
所以在你的第一个视图中添加
from django.contrib.auth import authenticate
user = authenticate(username=request.POST.get('username'),password=request.POST.get('password'))
request.session['user'] = user
在第二个视图中添加
profile = Profile()
profile.User = request.session.get('user')
# Add any more fields you need. get them form request.POST.get('otherfield')
profile.save()
确保在 settings.py 中您的应用程序中有“django.contrib.sessions” 和“django.contrib.sessions.middleware.SessionMiddleware”,在你的中间件中
,Python 是 case sensitive
代替
profile.User = 用户
,根据型号,应该是
profile.user = user
,
通过导入解决
from django.contrib.auth import login
和 register
视图内部:
user = form.save()
login(request,user)
最后,在 addiitionalInfo
内查看用户可在 request.user