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

Django用户激活系统问题:User.objects.get获取用户名返回None

问题原因分析

  1. User.objects.get('username')用法完全错误:get()方法需要传入键值对形式的查询条件(如get(username='testuser')),直接传字段名'username'会触发TypeError,根本无法正确获取用户,这是核心错误。
  2. 未在Session中绑定用户标识:验证码是和特定用户绑定的,你只在Session中存了验证码,没有存入对应用户的username/ID,导致验证通过后无法定位到要激活的用户。
  3. 表单验证逻辑遗漏括号:form.is_valid只是引用方法对象,永远为True,应该调用form.is_valid()才会真正执行表单验证。

解决方法

第一步:修改注册/发送验证码的视图(绑定用户到Session)

在生成验证码并发送邮件的步骤中,将对应用户的username同时存入Session:

def register(request):
    if request.method == 'POST':
        form = MyUserCreationForm(request.POST)
        if form.is_valid():
            # 创建用户但暂不激活
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            
            # 生成验证码(示例:随机6位数字)
            verification_code = str(random.randint(100000, 999999))
            # 将验证码和用户信息存入Session
            request.session['verification_code'] = verification_code
            request.session['active_username'] = user.username
            
            # 发送邮件逻辑(略)
            return redirect('activate')
    # 其他逻辑(略)

第二步:修正激活视图代码

def activeThroughCode(request):
    form = VerificationForm()
    if request.method == 'POST':
        form = VerificationForm(request.POST)
        # 修正:调用表单验证方法
        if form.is_valid():
            # 从表单清理后的数据获取验证码,比直接取POST更安全
            entered_code = form.cleaned_data.get('verification_code')
            stored_code = request.session.get('verification_code')
            # 从Session取出绑定的用户名
            stored_username = request.session.get('active_username')

            print("Entered Code:", entered_code)
            print("Stored Code:", stored_code)

            # 同时验证验证码和用户标识是否存在
            if entered_code == stored_code and stored_username:
                try:
                    user = User.objects.get(username=stored_username)
                    user.is_active = True
                    user.save()
                    messages.success(request, '您的账户已成功激活。')
                    # 验证成功后清除Session中的敏感数据,避免重复使用
                    del request.session['verification_code']
                    del request.session['active_username']
                    return redirect('login')
                except User.DoesNotExist:
                    messages.error(request, '找不到对应的用户,请重新注册。')
                    return redirect('register')
            else:
                messages.error(request, '验证码验证失败,请重试。')
    return render(request, 'activate.html', {'form': form})

额外注意事项

  • 可以给Session设置过期时间(如request.session.set_expiry(300),5分钟过期),防止验证码长期有效。
  • 若用户多次请求验证码,要更新Session中的验证码,避免旧验证码干扰。

内容的提问来源于stack exchange,提问作者Adryan Taborda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:45:10