Django密码修改表单链接未激活无法跳转应如何排查解决?
Django密码修改链接未激活修复方案
问题根因
问题由4处代码错误共同导致:
- 个人信息修改视图重复覆盖表单变量,POST提交的修改操作无效
- UserChangeForm默认的密码字段帮助文本链接指向Django后台,而非你自定义的密码修改页面
- 密码修改视图的模板路径大小写不匹配,会触发模板找不到错误
- 密码修改成功后未更新会话哈希,用户修改密码后会被强制登出
修复步骤
1. 修复views.py代码
删除user_change视图末尾多余的表单赋值代码,修正pass_change视图的模板路径,补充会话更新和成功跳转逻辑:
from django.shortcuts import redirect from django.contrib.auth import update_session_auth_hash @login_required def user_change(request): current_user = request.user form = UserProfileChange(instance = current_user) if request.method == 'POST': form = UserProfileChange(request.POST,instance = current_user) if form.is_valid(): form.save() # 保存成功后跳转到个人主页 return redirect('App_Login:profile') return render(request, 'App_Login/change_profile.html', context={'form':form}) @login_required def pass_change(request): current_user = request.user form = PasswordChangeForm(current_user) if request.method == 'POST': form = PasswordChangeForm(current_user, data = request.POST) if form.is_valid(): user = form.save() # 更新会话,避免用户被登出 update_session_auth_hash(request, user) # 保存成功跳转到个人主页 return redirect('App_Login:profile') # 修正模板路径大小写 return render(request, 'App_Login/pass_change.html', context = {'form':form})
2. 修复forms.py代码
移除UserProfileChange表单中的password字段,避免展示无效的默认链接:
class UserProfileChange(UserChangeForm): class Meta: model = User # 移除password字段 fields = ('username','email','first_name', 'last_name')
3. 修复change_profile.html模板,添加可点击的密码修改链接
在表单下方新增密码修改入口:
{% extends 'base.html' %} {% load crispy_forms_tags %} {% block title %} change User profile {% endblock %} {% block body_block %} <h2>Change Profile</h2> <form method="post"> {% csrf_token %} {{form|crispy}} <input type="submit" value="修改个人信息" class = "btn btn-primary btn-sm"> </form> <!-- 新增可点击的密码修改链接 --> <div class="mt-3"> <a href="{% url 'App_Login:pass_change' %}" class="btn btn-warning btn-sm">修改账户密码</a> </div> {% endblock %}
内容的提问来源于stack exchange,提问作者Nitin Saini
相关产品推荐
相关产品推荐

