在django的开发工程中,会遇到这样一个需求,用户需要修改密码。今天的主题就围绕这个需求,博客题目就叫“django修改用户密码”。
1、为了感受直观,先看效果图:
2、关键API
在django中,修改用户密码的关键在于调用User类的方法user.set_password(newpassword)。
下面从实际开发的角度说一下各个步骤。
3、url设置
在urls.py中添加如下两行代码,第一行是修改密码的url,第二行是成功修改密码后提示界面的url。
- url(r'^change_password$', 'accounts.views.change_password',name="change_password"),
url(r'^change_password_ok$', 'accounts.views.change_password_ok',name="change_password_ok"),
备注:我写博客时发现url会转意,我截图显示。
4、表单form
表单form一般会有单独的文件保存,这里我放在forms.py中,代码如下:
- # change password
- class changepasswordForm(forms.Form):
- oldpassword = forms.CharField(label=_(u"原口令"),max_length=30,widget=forms.PasswordInput(attrs={'size': 20,}))
- newpassword = forms.CharField(label=_(u"新口令"),max_length=30,widget=forms.PasswordInput(attrs={'size': 20,}))
- newpassword1 = forms.CharField(label=_(u"新口令确认"),max_length=30,widget=forms.PasswordInput(attrs={'size': 20,}))
从字面就可以看出,oldpassword、newpassword、newpassword1分别对应原口令、新口令、新口令确认。
5、视图函数
- # change password
- def change_password(request):
- if not request.user.is_authenticated():
- return HttpResponseRedirect(reverse("loginerror"))
- template = {}
- form = changepasswordForm()
- if request.method=="POST":
- form = changepasswordForm(request.POST.copy())
- if form.is_valid():
- username = request.user.username
- oldpassword = form.cleaned_data["oldpassword"]
- newpassword = form.cleaned_data["newpassword"]
- newpassword1 = form.cleaned_data["newpassword1"]
- user = authenticate(username=username,password=oldpassword)
- if user: #原口令正确
- if newpassword == newpassword1:#两次新口令一致
- user.set_password(newpassword)
- user.save()
- print '1'
- return HttpResponseRedirect(reverse("accounts.views.change_password_ok"))
- else:#两次新口令不一致
- template["word"] = '两次输入口令不一致'
- template["form"] = form
- print '2'
- return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))
- else: #原口令不正确
- if newpassword == newpassword1:#两次新口令一致
- template["word"] = '原口令不正确'
- template["form"] = form
- print '3'
- return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))
- else:#两次新口令不一致
- template["word"] = '原口令不正确,两次输入口令不一致'
- template["form"] = form
- print '4'
- return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))
- template["form"] = form
- return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))
根据注释和输出,可以大致看懂代码的结构。代码第14行 user = authenticate(username=username,password=oldpassword)用来验证用户原口令是否正确。随后的两层if/else将代码走向分为四种情况,1“原口令正确,两次新口令一致”;2“原口令正确,两次新口令不一致”;3“原口令不正确,两次新口令一致”;4“原口令不正确,两次新口令不一致”。如果合法用户按照规则填写表单,代码应该进入第1种情况“原口令正确,两次新口令一致”。代码第17、18行修改保存密码,第20行跳转至“已经成功修改口令”页面。
篇外
上文是从代码API的角度讲解如何修改用户密码的,其实还有一种直接通过shell修改django用户密码的方法,不过这主要针对另一种应用场景。具体来说,django的开发者可能忘记了用户密码。这时,我们可以在数据库中用sql修改密码,但是这涉及加密,有点麻烦。快捷高效的方式是直接通过django shell修改密码。
- python manage.py changepassword username
具体效果如下图: