Django项目密码重置遇TypeError:reset_password()收到意外参数uidb64
Django密码重置功能报错解决(TypeError: reset_password() got unexpected keyword argument 'uidb64')
问题根源
- 路由映射错误:
reset_password_validate路由错误绑定到了views.reset_password,但实际该路由应关联专门处理验证逻辑的reset_password_validate视图函数。 - 视图函数重复定义:
views.py中存在两个同名的reset_password函数,无参数的版本覆盖了带参数的版本,导致路由传递uidb64和token参数时,函数无法接收。 - 流程逻辑混淆:验证链接的处理逻辑和密码重置页面的渲染逻辑被错误绑定,导致参数传递混乱。
修复步骤
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 %}
验证修复效果
- 重新发送密码重置邮件,点击邮件中的链接
- 确认能正常进入密码重置页面
- 提交新密码后,验证是否能成功登录
内容的提问来源于stack exchange,提问作者Kerrr
相关产品推荐
相关产品推荐

