Django用户激活系统问题:User.objects.get获取用户名返回None
问题原因分析
User.objects.get('username')用法完全错误:get()方法需要传入键值对形式的查询条件(如get(username='testuser')),直接传字段名'username'会触发TypeError,根本无法正确获取用户,这是核心错误。- 未在Session中绑定用户标识:验证码是和特定用户绑定的,你只在Session中存了验证码,没有存入对应用户的username/ID,导致验证通过后无法定位到要激活的用户。
- 表单验证逻辑遗漏括号:
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
相关产品推荐
相关产品推荐

