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

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()后添加会话更新代码,避免用户改完密码被强制登出:
    首先在视图文件顶部导入依赖方法:
    from django.contrib.auth import update_session_auth_hash
    
    然后在post方法的user.save()代码后添加:
    update_session_auth_hash(request, user)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:09:18