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

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/

修复方法

  1. 直接访问正确路径http://127.0.0.1:8000/account/password/
  2. 页面跳转时避免硬编码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:50