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

测试用户密码修改失败问题求助(Django项目)

问题分析与修复方案

核心问题总结

用户在修改密码时无任何反应,本质是密码修改的核心逻辑未被触发,同时存在代码缺失、模板错误等问题,导致预期效果无法实现。以下是具体修复点:


1. 修复视图中的导入与逻辑触发条件

问题:

  • update_session_auth_hash函数未导入,执行时会抛出NameError,导致密码修改成功后流程中断。
  • 视图通过'change_password' in request.POST判断是否触发密码修改,但模板中的提交按钮无对应name属性,该条件永远不成立,密码修改逻辑完全未执行。
  • 模板中用到note_form但视图未传递,会引发模板渲染错误。

修复代码(views.py):

from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render, redirect
from django.views import View
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash  # 新增缺失的导入
from .models import Note
from .forms import NoteForm  # 导入笔记表单(需确保已定义)

class MyAccountView(View):
    template_name = "my_account.html"

    def get(self, request):
        password_form = PasswordChangeForm(request.user)
        notes = Note.objects.filter(user=request.user)
        note_form = NoteForm()  # 初始化笔记表单并传入模板

        context = {"password_form": password_form, "notes": notes, "note_form": note_form}
        return render(request, self.template_name, context)

    def post(self, request):
        password_form = PasswordChangeForm(request.user, request.POST)

        # 通过提交按钮的name值识别操作类型
        if request.POST.get('action') == 'change_password':
            if password_form.is_valid():
                user = password_form.save()
                update_session_auth_hash(request, user)  # 保持用户登录状态
                messages.success(request, "密码修改成功。")
                return redirect("my_account")
            else:
                messages.error(request, "密码修改失败,请检查输入内容。")
                return redirect("my_account")
        elif request.POST.get('action') == 'add_note':
            # 处理笔记添加逻辑
            note_form = NoteForm(request.POST)
            if note_form.is_valid():
                note = note_form.save(commit=False)
                note.user = request.user
                note.save()
                messages.success(request, "笔记添加成功。")
            else:
                messages.error(request, "笔记添加失败。")
            return redirect("my_account")

        # 默认重定向回账户页
        return redirect("my_account")

2. 修复模板中的提交按钮与消息提示

问题:

  • 密码修改表单的提交按钮无name属性,无法触发视图中的密码修改判断。
  • 消息提示仅显示成功样式的alert,错误消息未使用对应错误样式,且alert标签未闭合。

修复代码(my_account.html):

{% extends 'dependencies.html' %} {% block content %}
<div class="container">
    <h1>我的账户</h1>

    <!-- 区分成功与错误的消息提示 -->
    {% if messages %}
        {% for message in messages %}
            <div class="alert {% if message.tags == 'success' %}alert-success{% else %}alert-danger{% endif %}">
                {{ message }}
            </div>
        {% endfor %}
    {% endif %}

    <h2>修改密码</h2>
    <form method="post" id="password-form">
        {% csrf_token %} 
        {{ password_form.non_field_errors }}
        
        <div class="form-group">
            <label for="{{ password_form.old_password.id_for_label }}">旧密码:</label>
            {{ password_form.old_password }} 
            {{ password_form.old_password.errors }}
        </div>
        <div class="form-group">
            <label for="{{ password_form.new_password1.id_for_label }}">新密码:</label>
            {{ password_form.new_password1 }} 
            {{ password_form.new_password1.errors }}
        </div>
        <div class="form-group">
            <label for="{{ password_form.new_password2.id_for_label }}">确认密码:</label>
            {{ password_form.new_password2 }} 
            {{ password_form.new_password2.errors }}
        </div>
        <!-- 添加name属性用于视图识别操作 -->
        <button type="submit" name="action" value="change_password" class="btn btn-primary">
            修改密码
        </button>
    </form>

    <h2>添加笔记</h2>
    <form method="post" id="note-form">
        {% csrf_token %} 
        {{ note_form.non_field_errors }}
        <div class="form-group">
            <label for="{{ note_form.content.id_for_label }}">笔记:</label>
            {{ note_form.content }} 
            {{ note_form.content.errors }}
        </div>
        <!-- 添加name属性用于视图识别操作 -->
        <button type="submit" name="action" value="add_note" class="btn btn-primary">
            添加笔记
        </button>
    </form>

    <h2>我的笔记</h2>
    <ul>
        {% for note in notes %}
        <li>{{ note.content }}</li>
        {% endfor %}
    </ul>
</div>
{% endblock %}

3. 额外验证事项

  • 确保已定义NoteForm表单类(对应笔记功能),否则视图中的导入会报错。
  • 测试时使用符合Django默认规则的新密码(如长度≥8位、不与旧密码重复等),分别验证密码修改成功/失败的提示是否正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:03:19