Django - 使用附加配置文件字段创建用户

问题描述

我有一个视图,可以在其中收集用户数据并将其保存到后端。

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)

意味着我需要提供我想要为其创建此 userprofile。我如何获取刚刚使用 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...