Django注册视图QuerySet无pk属性报错及验证页展示手机号问题
问题解决方法
错误原因
你触发的AttributeError: 'QuerySet' object has no attribute 'pk'是因为account_register视图中调用filter()方法返回的是Django QuerySet集合对象,不是单个用户模型实例,因此不存在pk属性。同时代码中还存在两处隐含问题:ORM调用拼写错误、account_verify视图变量未定义风险。
具体修改步骤
1. 修正account_register视图逻辑
替换原有注册逻辑中的查询、新建用户代码段,修改后代码如下:
def account_register(request): if request.user.is_authenticated: return redirect("store:home") if request.method == "POST": registerForm = RegistrationForm(request.POST) if registerForm.is_valid(): username = registerForm.cleaned_data["user_name"] phone_number = registerForm.cleaned_data["phone_number"] password = registerForm.cleaned_data["password"] # 先校验手机号是否已注册,修正ORM拼写:object → objects if User.objects.filter(phone_number=phone_number).exists(): return HttpResponse("this phone number already taken", status=400) # 新建用户 new_user = User( phone_number=phone_number, username=username ) new_user.set_password(password) new_user.is_active = False new_user.save() # 直接取新建用户的pk存入session request.session['pk'] = new_user.pk return redirect("account:account_verify") else: registerForm = RegistrationForm() return render(request, "account/authentication.html", {"form": registerForm})
2. 修正account_verify视图隐含问题
原有代码中如果请求无pk参数时,user_phone_number变量未定义会触发NameError,同时也需要修正ORM拼写错误,修改后代码如下:
def account_verify(request): form = CodeForm(request.POST or None) pk = request.session.get('pk') # 无pk直接跳转注册页,避免变量未定义报错 if not pk: return redirect("account:register") # 修正ORM拼写:object → objects user = User.objects.get(pk=pk) code = user.code user_phone_number = user.phone_number code_user = f"{user.code}" if not request.POST: send_sms(code_user, user.phone_number) if form.is_valid(): num = form.cleaned_data.get('number') if str(code) == num: user.is_active = True user.save() login(request, user) # 校验成功后删除session中的pk,避免重复复用 del request.session['pk'] return redirect("store:home") else: return redirect("account:register") context = { 'form': form, 'user_phone_number': user_phone_number } return render(request, "account/verify.html", context)
3. 手机号展示使用说明
你用context传递手机号的写法完全正确,在verify.html模板中直接使用{{ user_phone_number }}即可渲染出用户手机号。
内容的提问来源于stack exchange,提问作者rickoutis
相关产品推荐
相关产品推荐

