以下:
我在打这个电话时遇到了麻烦:
@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中一直得到一个匿名用户对象,没有属性对象可疑对象:
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提供了额外的内容(通常在个人资料中填写),但不确定在哪里/如何让用户填写。
注册后给我匿名用户错误
注册后,因为没有填写APOUuser的内容,所以不允许@reciever工作吗?
是,请删除接收器-尽管不是造成此特定问题的原因,但是一旦解决,它会引起问题
错误原因如下:由于您还没有登录用户,因此也没有个人资料。但是你不需要一个。不需要在那里传递实例参数。
您要做要做的是根据保存配置文件表单的结果来设置用户-就像您对保存用户表单的结果设置is_active一样以一种方式。
所以:
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()
...