Django访问/force-password-change/修改密码时报NoReverseMatch错误
问题描述
项目使用Django自带用户系统,用户提交修改密码请求时触发NoReverseMatch报错,报错信息如下:
NoReverseMatch at /force-password-change/ Reverse for '' not found. '' is not a valid view function or pattern name. Request Method: POST Request URL: http://localhost.example.jp:8010/force-password-change/ Django Version: 3.2.7 Exception Type: NoReverseMatch Exception Value: Reverse for '' not found. '' is not a valid view function or pattern name. Exception Location: /Users/whitebear/.local/share/virtualenvs/example-admin-mg9y4sUV/lib/python3.9/site-packages/django/urls/resolvers.py, line 694, in _reverse_with_prefix Python Executable: /Users/whitebear/.local/share/virtualenvs/example-admin-mg9y4sUV/bin/python Python Version: 3.9.10 Python Path: ['/Users/whitebear/MyCode/httproot/suntory_cdk/example-admin', '/Users/whitebear/MyCode/httproot/suntory_cdk/example-admin/example-shared-models', '/Users/whitebear/MyCode/httproot/suntory_cdk/example-admin/$PYTHONPATH', '/Users/whitebear/.pyenv/versions/3.9.10/lib/python39.zip', '/Users/whitebear/.pyenv/versions/3.9.10/lib/python3.9', '/Users/whitebear/.pyenv/versions/3.9.10/lib/python3.9/lib-dynload', '/Users/whitebear/.local/share/virtualenvs/example-admin-mg9y4sUV/lib/python3.9/site-packages']
关联报错代码位于users/views.py,对应视图代码:
class PasswordChangeView(LoginRequiredMixin, FormView): template_name = "users/password_change.html" form_class = PasswordChangeForm success_url = reverse_lazy("") def get(self, request, *args, **kwargs): form = self.form_class() user = get_object_or_404(User, username=self.request.user.username) return render(request, self.template_name, {"form": form, "email": user.email}) def post(self, request, *args, **kwargs): print("password is posted") form = self.form_class(request.POST) if form.is_valid(): data = form.cleaned_data user = get_object_or_404(User, username=request.user.username) user.set_password(data["new_password1"]) user.is_require_pwd_change = False user.save() return super(PasswordChangeView, self).form_valid(form) return super(PasswordChangeView, self).form_invalid(form)
根因分析
报错直接触发点是视图类中success_url = reverse_lazy("")配置错误。reverse_lazy函数的作用是通过路由的name字段反向解析出对应的URL路径,传入空字符串时,Django的路由系统无法匹配到任何已注册的命名路由,因此在表单校验通过、执行跳转逻辑时抛出NoReverseMatch异常。
修复步骤
- 确认密码修改成功后的跳转目标页面,找到项目
urls.py中对应路由配置的name属性值,例如首页路由配置为path('', HomeView.as_view(), name='home')时,路由名就是home。 - 将
success_url的空字符串参数替换为实际的路由名,示例:# 替换为你项目中实际的目标路由name success_url = reverse_lazy("home") - 补充会话更新逻辑:Django用户修改密码后默认会失效当前登录会话,若需要保留登录态,在
user.save()后添加会话更新代码,避免用户改完密码被强制登出:
首先在视图文件顶部导入依赖方法:
然后在post方法的from django.contrib.auth import update_session_auth_hashuser.save()代码后添加:update_session_auth_hash(request, user)
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

