Django中新注册用户激活后无法登录,提示DoesNotExist错误
问题分析与解决方案
可能的原因1:激活过程异常被静默吞掉,用户未真正激活
你的VerificationView中使用了except Exception as ex: pass,这会吞掉所有激活过程中的异常(比如UID解码错误、用户不存在等),导致用户点击激活链接后,即使激活失败也会被重定向到登录页,且没有任何错误提示。此时新用户的is_active仍为False,但如果后续流程依赖激活状态,可能引发异常。
修复方式:
移除静默吞异常的逻辑,添加明确的错误提示:
class VerificationView(View): def get(self, request, uidb64, token): try: id = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=id) if not token_generator.check_token(user, token): # 修复URL参数拼接错误,添加等号并编码空格 return redirect("login?message=User+already+activated") if user.is_active: messages.info(request, "Account is already activated") return redirect("login") user.is_active = True user.save() messages.success(request, "Account activated successfully") return redirect("login") except (User.DoesNotExist, ValueError, TypeError) as ex: messages.error(request, "Invalid activation link") return redirect("login")
可能的原因2:登录后重定向的expenses视图依赖用户关联对象,新用户未创建
老用户登录正常、新用户登录报错DoesNotExist,大概率是expenses视图中使用了get()方法获取用户的关联模型(比如消费记录、个人资料等),而新用户激活后尚未创建该关联对象,导致查询失败。
修复方式:
假设expenses视图中有类似错误代码:
def expenses(request): # 新用户无数据时会直接抛出DoesNotExist异常 user_expense = Expense.objects.get(user=request.user) return render(request, 'expenses.html', {'expense': user_expense})
改为以下两种处理方式之一:
- 使用
filter()返回列表,无数据时为空:
def expenses(request): user_expenses = Expense.objects.filter(user=request.user) return render(request, 'expenses.html', {'expenses': user_expenses})
- 捕获对象不存在的异常,给出友好提示:
def expenses(request): try: user_expense = Expense.objects.get(user=request.user) except Expense.DoesNotExist: messages.info(request, "No expense records found, add your first expense!") user_expense = None return render(request, 'expenses.html', {'expense': user_expense})
额外优化点
- 修复
VerificationView中重定向URL的拼接错误:原代码生成的URL参数格式无效,改为合法的参数拼接方式,确保提示信息能正确传递。 - 登录逻辑中对
user.is_active的检查是正确的,激活失败的用户登录时会收到明确提示,避免用户混淆。
内容的提问来源于stack exchange,提问作者Mukhammadkodir
相关产品推荐
相关产品推荐

