Django重置密码时出现NoReverseMatch错误,请求技术帮助
问题排查与修复
核心错误:URL反向解析缺少必要参数
你的reset_password路由定义时要求传入<str:active_code>参数,但模板表单的action标签中调用{% url "reset_password" %}时没有传递该参数,这直接触发了NoReverseMatch错误。
修复步骤:
修改视图,将激活码传入模板上下文
在ResetPassword视图的get方法中,把active_code添加到context里:context={ 'reset_password_form' : reset_password_form, 'title': 'Reset My Password', 'active_code': active_code # 新增此行 }更新模板的表单action
在url标签中补充active_code参数:<form action="{% url "reset_password" active_code=active_code %}"> {% csrf_token %} {{ reset_password_form.label_tag }} {{ reset_password_form }} {{ reset_password_form.errors }} <button type="submit" class="btn btn-default">Reset My Password</button> </form>
次要错误:视图中的判断逻辑有误
你当前代码里写的if User is None:是在判断User类是否为None,这永远不会成立,正确的应该是判断查询到的user实例是否为空:
# 原错误代码 if User is None: # 修改后 if user is None:
额外优化建议
密码重置属于敏感操作,建议使用POST方法提交表单:
- 模板中添加
method="post":<form action="{% url "reset_password" active_code=active_code %}" method="post"> - 为
ResetPassword视图添加post方法处理表单提交逻辑:def post(self, request, active_code): user = User.objects.filter(email_active_code__iexact=active_code).first() if user is None: return redirect(reverse('login-page')) reset_password_form = ResetPasswordForm(request.POST) if reset_password_form.is_valid(): new_password = reset_password_form.cleaned_data.get('new_password') user.set_password(new_password) user.email_active_code = "" # 重置激活码防止重复使用 user.save() return redirect(reverse('login-page')) context={ 'reset_password_form' : reset_password_form, 'title': 'Reset My Password', 'active_code': active_code } return render(request, 'account_module/reset_password.html', context)
内容的提问来源于stack exchange,提问作者A.L
相关产品推荐
相关产品推荐

