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

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})

改为以下两种处理方式之一:

  1. 使用filter()返回列表,无数据时为空:
def expenses(request):
    user_expenses = Expense.objects.filter(user=request.user)
    return render(request, 'expenses.html', {'expenses': user_expenses})
  1. 捕获对象不存在的异常,给出友好提示:
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})

额外优化点

  1. 修复VerificationView中重定向URL的拼接错误:原代码生成的URL参数格式无效,改为合法的参数拼接方式,确保提示信息能正确传递。
  2. 登录逻辑中对user.is_active的检查是正确的,激活失败的用户登录时会收到明确提示,避免用户混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:44