测试用户密码修改失败问题求助(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
相关产品推荐
相关产品推荐

