django练手(十四):实现网站用户修改密码的功能
1.django练手(一):使用pycharm,新建一个django项目2.django练手(二):修改settins.py文件,为项目开发做准备3.django练手(三):制作第一个网页4.django练手(四):制作网站的导航栏5.django练手(五):优化模板的功能6.django练手(六):优化网站导航7.django练手(七):连接数据库8.django练手(八):创建一个系统超级用户9.django练手( 九):扩展django自带的用户模型10.django练手( 十):扩展字段后,django用户管理后台一些功能缺失及修复方法11.django练手( 十一):实现网站的用户注册功能12.django练手( 十二):实现网站的登录功能13.django练手(十三):实现网站的注销功能
14.django练手(十四):实现网站用户修改密码的功能
15.django练手(十五):实现某些页面不登录不能访问的功能16.django练手(十六):增加一个上传图标的功能17.django练手(十七):关于本项目的代码18.django练手(十八):优化上传方式:使用FormData和ajax实现异步上传19.django练手(十九):图标上传页面增加浏览图标的功能20.django练手(二十):图标上传页面增加分页的功能21.django练手(二十一):增加图片预览功能22.django练手(二十二):增加删除图片的功能23.django练手(二十三):增加用户选择自己头像的功能24.django练手( 二十四):用户其它信息的修改25.django练手( 二十五):上传图标的页面仅授权人员可以访问一、修改密码的Form。
思路:
1、定义三个输入框,分别是老密码,新密码,重复密码。
2、重写Form的__init__方法,加入request参数,以便验证数据有效性的时候把request传进来。
3、利用request,获取数据库中保存的密码,并与老密码校验。如果结果为False,提示错误,老密码输入不正确。
4、获取新密码,校验新密码的位数,不符合提示错误。
5、校验重复密码,新密码。如果重复密码与新密码不一致,提示错误。如果新密码与老密码相同,提示密码没有更改。
代码如下:
class ChangePassword(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, required=True, label='原密码', min_length=8,
max_length=25,
error_messages={'required': '密码不能为空', 'min_length': '密码长度介于8-25位',
'max_length': '密码长度介于8-25位'})
new_password = forms.CharField(widget=forms.PasswordInput, required=True, label='新密码', min_length=8,
max_length=25,
error_messages={'required': '密码不能为空', 'min_length': '密码长度介于8-25位',
'max_length': '密码长度介于8-25位'})
confirm_new_password = forms.CharField(widget=forms.PasswordInput, required=True, label='新密码', min_length=8,
max_length=25,
error_messages={'required': '密码不能为空',
'min_length': '密码长度介于8-25位',
'max_length': '密码长度介于8-25位'})
# 修改父类的__init__方法,实现可以从视图获取request。同时,给表单增加bootstrap样式
def __init__(self, request, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = request
# 给表单加上bootstrap的样式
for name, field in self.fields.items():
field.widget.attrs['class'] = "form-control"
field.widget.attrs['placeholder'] = '请输入{}'.format(field.label)
def clean_old_password(self):
# 获取用户输入的密码(未加密)
old_password = self.cleaned_data['old_password']
# 获取当前用户的密码(已加密)
password = self.request.user.password
# 使用auth组件,hashers下的check_password方法,可以验证加密后的密码与未加密的密码是否相同
if not check_password(old_password, password):
raise ValidationError('原密码输入不正确,请重新输入')
return old_password
def clean_new_password(self):
new_password = self.cleaned_data['new_password']
if len(new_password) > 20 or len(new_password) < 7:
raise ValidationError('密码不能小于8位或大于20位')
return new_password
def clean_confirm_new_password(self):
confirm_new_password = self.cleaned_data['confirm_new_password']
new_password = self.cleaned_data.get('new_password', '')
old_password = self.cleaned_data.get('old_password', '')
if confirm_new_password != new_password:
raise ValidationError('两次输入密码不一致')
if new_password == old_password:
raise ValidationError('密码没有更改,请重新输入')
return confirm_new_password
二、修改密码的View。
代码如下:
def change_password(request):
if request.method == 'GET':
fields = ChangePassword(request)
return render(request, 'app/change_password.html', {'fields': fields})
if request.method == 'POST':
data = request.POST
fields = ChangePassword(request, data)
if fields.is_valid():
# 获取清洗过的新密码
new_password = fields.cleaned_data.get('new_password', '')
# 获取当前用户
user = request.user
# 用新密码修改当前用户的密码
user.set_password(new_password)
# 保存当前用户
user.save()
# 当前用户重新登录
login(request, user)
return JsonResponse({'status':True})
else:
return JsonResponse({'status':False,'errors':fields.errors})
三、修改密码的路由。
代码如下:
from django.urls import path
from app.views.app.views import *
urlpatterns = [
path('register/', register, name='register'), # 注册的路由
path('login/', login_view, name='login'), # 登录的路由
path('logout/', auth_logout, name='logout'), # 注销的路由
path('changepwd/', change_password, name='change_password'), # 修改密码的路由
]
四、修改密码的模板
修改密码的模板与注册、登录的模板基本一致,不再贴出代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现