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

Django项目密码重置遇TypeError:reset_password()收到意外参数uidb64

Django密码重置功能报错解决(TypeError: reset_password() got unexpected keyword argument 'uidb64')

问题根源

  1. 路由映射错误:reset_password_validate路由错误绑定到了views.reset_password,但实际该路由应关联专门处理验证逻辑的reset_password_validate视图函数。
  2. 视图函数重复定义:views.py中存在两个同名的reset_password函数,无参数的版本覆盖了带参数的版本,导致路由传递uidb64和token参数时,函数无法接收。
  3. 流程逻辑混淆:验证链接的处理逻辑和密码重置页面的渲染逻辑被错误绑定,导致参数传递混乱。

修复步骤

1. 修正URL路由配置

修改urls.py中的reset_password_validate路由,将视图指向正确的函数:

path('reset_password_validate/<str:uidb64>/<str:token>/', views.reset_password_validate, name='reset_password_validate'),

2. 删除重复的视图函数

删掉views.py末尾无参数的reset_password函数,保留带参数的版本:

# 移除这段重复代码
def reset_password(request):
    return render(request, 'accounts/emails/reset_password_email.html')

3. 优化密码重置视图逻辑(可选)

原带参数的reset_password函数可以简化,利用验证步骤存入session的用户ID来获取用户,避免重复解码:

def reset_password(request):
    if request.method == 'POST':
        password = request.POST['password']
        uid = request.session.get('uid')
        if uid:
            user = User.objects.get(pk=uid)
            user.set_password(password)
            user.save()
            messages.success(request, '密码重置成功,请使用新密码登录。')
            del request.session['uid']  # 清理临时session数据
            return redirect('login')
        messages.error(request, '无效的重置请求。')
        return redirect('myAccount')
    return render(request, 'accounts/reset_password.html')

4. 确认重置邮件模板的URL名称

确保密码重置邮件模板(reset_password_email.html)中的URL使用正确的路由名称:

{% autoescape off %}
Hi {{user.first_name}}, 

请点击以下链接重置您的密码:
http://{{ domain }}{% url 'reset_password_validate' uidb64=uid token=token %}

{% endautoescape %}

验证修复效果

  1. 重新发送密码重置邮件,点击邮件中的链接
  2. 确认能正常进入密码重置页面
  3. 提交新密码后,验证是否能成功登录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:23:20