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

如何修复Django中/auth/password_change/路径下的NoReverseMatch错误

Django NoReverseMatch 错误:修改密码页面触发tabel_list反向解析失败

问题重现

  • 点击「修改密码」按钮,访问/auth/password_change/路径时抛出NoReverseMatch错误
  • 错误详情:

NoReverseMatch at /auth/password_change/Reverse for 'tabel_list' with arguments '('',)' not found. 1 pattern(s) tried: ['groups/(?P[-a-zA-Z0-9_]+)/$']

问题原因

错误源于全局模板header.html中的导航链接代码:

{% url 'schedules:tabel_list' student.group.slug %}

Django自带的PasswordChangeView不会将student对象注入到模板上下文,但该header会在所有已认证用户的页面加载。当访问密码修改页面时,模板尝试解析这个URL,却因student变量未定义(或student.group.slug为空),传递了空字符串作为slug参数,不符合tabel_list路由的参数要求。

解决方案

方案1:仅在数据有效时渲染导航链接(推荐)

修改header.html,增加判断逻辑,确保存在有效student和group.slug时才渲染「Расписание」链接:

{% if request.user.is_authenticated %}
  {% with student=request.user.student_id.first %}
    {% if student and student.group.slug %}
      <li class="nav-item">
        <a class="nav-link {% if view_name  == 'schedules:tabel_list' %}active{% endif %}"
           href="{% url 'schedules:tabel_list' student.group.slug %}"
        >
          Расписание
        </a>
      </li>
    {% endif %}
  {% endwith %}
  <li class="nav-item">
    <a class="nav-link disabled" href="#">Модульный журнал</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" href="#">Библиотека</a>
  </li>
{% endif %}

通过request.user.student_id.first直接关联当前用户对应的Student对象(利用Student模型中student_id字段的反向关联),同时增加双重判断避免空参数。

方案2:自定义密码修改视图注入上下文

如果需要在密码修改页面仍显示该导航链接,可以自定义PasswordChangeView,将student对象注入模板上下文:

  1. 在users/views.py中添加自定义视图:
from django.contrib.auth.views import PasswordChangeView

class CustomPasswordChangeView(PasswordChangeView):
    template_name = 'users/password_change_form.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 获取当前用户关联的Student对象
        context['student'] = self.request.user.student_id.first()
        return context
  1. 修改users/urls.py中的密码修改路由:
path(
    'password_change/',
    views.CustomPasswordChangeView.as_view(),
    name='password_change'
),

方案3:为空参数设置默认值(不推荐)

若需强制显示链接,可给slug参数设置默认值,但需确保默认slug对应有效群组:

{% url 'schedules:tabel_list' student.group.slug|default:'default-group-slug' %}

此方案仅临时规避错误,若默认slug不存在仍会触发404,不是最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:35:41