【问题标题】:Adding a profile to user in django在 django 中向用户添加配置文件
【发布时间】:2019-10-02 19:01:48
【问题描述】:

接下来:

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

我在拨打这个电话时遇到了一些问题:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

在他们的示例中,我猜这在注册新帐户时可以正常工作,因为他们示例中的配置文件包含所有可以为空白和 null 的字段。就我而言,我在这里尝试维护的个人资料称为:

class APOUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    institution =  models.ForeignKey("mainpage.InstitutionMember", on_delete=models.PROTECT)
    gender = models.ForeignKey("mainpage.GenderTable", on_delete=models.PROTECT)
    on_site_status = models.ForeignKey("mainpage.SiteStatus", on_delete=models.PROTECT)
    refer_to_as = models.TextField(max_length = 30, blank=True) #if the above is custom
    room_preference  = models.ForeignKey("housing.Room", on_delete=models.PROTECT)

它最终引用了从表单中选择的下拉菜单(由另一个具有默认值的表填充)。那么我是否要删除@reciever,然后让用户在注册并确认他们的帐户后以某种方式单独填写个人资料?

我尝试将我的注册表单与个人资料表单混合使用...但是当我尝试混合注册表单和个人资料表单时,在 views.py 中不断得到一个匿名用户对象没有属性对象 apouser:

 def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        profile_form = ProfileForm(request.POST, instance=request.user.apouser)

        if form.is_valid() and profile_form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            profile_form.save()
            current_site = get_current_site(request)
            mail_subject = 'Activate your APO account.'
            message = render_to_string('acc_active_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid':urlsafe_base64_encode(force_bytes(user.pk)),
                'token':account_activation_token.make_token(user),
            })
            to_email = form.cleaned_data.get('email')
            email = EmailMessage(
                        mail_subject, message, to=[to_email]
            )
            email.send()
            return redirect('plsactivate')
            #return HttpResponse('Please confirm your email address to complete the registration')
            #form.save()
            #username = form.cleaned_data.get('username')
            #raw_password = form.cleaned_data.get('password1')
            #user = authenticate(username=username, password=raw_password)
            #login(request, user)
            #return redirect('/')
    else:
        form = SignUpForm()        
        profile_form = ProfileForm(instance=request.user.apouser) #<-- error here
    return render(request, 'signup.html', {'form': form, 'profile_form': profile_form})
    #return render(request, 'signup.html', {'form': form})

所以不确定我需要的正确方法。我的常规用户默认使用默认 django 注册提供的基本内容。然后我让 APOUser 有额外的东西(通常在个人资料中填写),但不确定在哪里/如何让用户填写。

注册时出现匿名用户错误

注册后不会让@reciever 工作,因为没有填写任何 APOUuser 内容?

【问题讨论】:

    标签: python django django-users


    【解决方案1】:

    是的,移除接收器 - 虽然它不是这个特定问题的原因,但一旦你修复它就会导致问题

    您的错误原因正如它所说:由于您还没有登录用户,因此您也没有个人资料。但你不需要一个;不需要在那里传递实例参数。

    需要做的是将用户设置为保存配置文件表单的结果 - 就像您在保存用户表单的结果上设置 is_active 一样。 p>

    所以:

    if request.method == 'POST':
        form = SignUpForm(request.POST)
        profile_form = ProfileForm(request.POST,)
    
        if form.is_valid() and profile_form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            profile = profile_form.save(commit=False)
            profile.user = user
            profile.save()
            ...
    else:
        form = SignUpForm()        
        profile_form = ProfileForm()
    ...
    

    【讨论】:

    • 伙计,你太擅长这个了。这解决了它,我在注册期间在表格上看到了正确的东西!呜呼!我以前从未在 Django 中尝试过,所以这都是非常棒的东西
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多