Django密码修改表单无法加载且出现404错误,如何解决?
Django 404错误与密码修改表单异常修复方案
一、404路径不匹配问题解决
问题原因
你访问的http://127.0.0.1:8000/5/password/在现有URL配置中无对应匹配规则:
- 主
urls.py将App_Login的URL规则挂载在account/路径下 App_Login/urls.py中密码修改的路径为password/- 正确的访问路径应为
http://127.0.0.1:8000/account/password/
修复方法
- 直接访问正确路径
http://127.0.0.1:8000/account/password/ - 页面跳转时避免硬编码URL,使用Django的URL反向解析生成路径,示例:
<a href="{% url 'pass_change' %}">修改密码</a>
二、密码修改表单加载与逻辑异常修复
1. 视图函数逻辑修正(views.py)
原代码存在缩进错误,导致GET请求时也会执行表单验证,且修改状态错误触发。修正后的代码:
@login_required def pass_change(request): current_user = request.user change = False if request.method == "POST": form = PasswordChangeForm(current_user, data=request.POST) if form.is_valid(): form.save() change = True else: form = PasswordChangeForm(current_user) return render( request, "App_Login/pass_change.html", context={"form": form, "change": change}, )
- 将表单验证逻辑缩进至
POST请求判断内,避免GET请求时误执行 - 仅在表单验证通过后设置
change=True - 非POST请求时初始化空表单
2. 模板渲染修正(pass_change.html)
原模板存在重复渲染表单、缺少提交按钮、CSRF令牌位置错误等问题。修正后的代码:
{% extends 'base.html' %} {% load crispy_forms_tags %} {% block title_block %} Change Password {% endblock %} {% block body_block %} {% if change %} <p>Password changed successfully.</p> {% endif %} <form method="POST"> {% csrf_token %} {{ form|crispy }} <button type="submit">Change Password</button> </form> {% endblock %}
- 移除重复的
{% crispy form %}标签,避免表单重复渲染 - 将表单包裹在
<form>标签内并指定method="POST" - 添加提交按钮,确保表单可正常提交
- 将CSRF令牌放在表单内部,符合Django安全规范
内容的提问来源于stack exchange,提问作者Mostafa Ahnaf Hossain
相关产品推荐
相关产品推荐

