【问题标题】:Django - Create User with Additional Profile FieldsDjango - 使用其他配置文件字段创建用户
【发布时间】:2021-04-06 06:14:12
【问题描述】:

我有一个收集用户数据并将其保存到后端的视图。

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})

完成后,我会将用户重定向到另一个页面,他们可以在其中以另一种形式为他们的个人资料提供其他信息,例如他们的出生日期、个人资料图片等。

这对视图使用以下代码:

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。如何获取刚刚使用register 视图注册的user 的信息并使其在additionalInfo 视图中可用?

【问题讨论】:

    标签: python django django-forms django-users


    【解决方案1】:

    您可以将用户 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',在你的中间件中

    【讨论】:

    • 我如何将该用户包含在我的代码中以确保它与 ProfileForm 中的数据相结合?
    • 我在additionalInfo 视图中得到None 作为request.user.id - 当我在将其设置在register 视图中之前记录它时,我得到AnonymousUser
    • 我已经用我当前的代码更新了这个问题。
    • 试试 request.user
    • 它的 AnonymousUser - 我认为问题在于,当帐户注册时,系统实际上并没有登录用户。有没有办法在注册时强制登录?
    【解决方案2】:

    Python 是case sensitive

    代替

    profile.User = 用户

    ,根据型号,应该是

    profile.user = user
    

    【讨论】:

      【解决方案3】:

      通过导入解决

      from django.contrib.auth import login
      

      register 视图内部:

      user = form.save()
      login(request, user)
      

      最后,addiitionalInfo 内部视图用户可在request.user 获得

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 1970-01-01
        • 2012-07-14
        • 2019-05-23
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        相关资源
        最近更新 更多