You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:27:02