在django的开发工程中,会遇到这样一个需求,用户需要修改密码。今天的主题就围绕这个需求,博客题目就叫“django修改用户密码”。
1、为了感受直观,先看效果图:

2、关键API
在django中,修改用户密码的关键在于调用User类的方法user.set_password(newpassword)。
下面从实际开发的角度说一下各个步骤。

3、url设置

在urls.py中添加如下两行代码,第一行是修改密码的url,第二行是成功修改密码后提示界面的url。

 
  
  1. 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中,代码如下:

 
  
  1. # change password 
  2. class changepasswordForm(forms.Form): 
  3.     oldpassword = forms.CharField(label=_(u"原口令"),max_length=30,widget=forms.PasswordInput(attrs={'size'20,})) 
  4.     newpassword = forms.CharField(label=_(u"新口令"),max_length=30,widget=forms.PasswordInput(attrs={'size'20,})) 
  5.     newpassword1 = forms.CharField(label=_(u"新口令确认"),max_length=30,widget=forms.PasswordInput(attrs={'size'20,})) 

从字面就可以看出,oldpassword、newpassword、newpassword1分别对应原口令、新口令、新口令确认。

5、视图函数

 
  
  1. # change password  
  2. def change_password(request): 
  3.     if not request.user.is_authenticated(): 
  4.         return HttpResponseRedirect(reverse("loginerror")) 
  5.     template = {} 
  6.     form = changepasswordForm()     
  7.     if request.method=="POST"
  8.         form = changepasswordForm(request.POST.copy()) 
  9.         if form.is_valid(): 
  10.             username = request.user.username 
  11.             oldpassword = form.cleaned_data["oldpassword"
  12.             newpassword = form.cleaned_data["newpassword"
  13.             newpassword1 = form.cleaned_data["newpassword1"
  14.             user = authenticate(username=username,password=oldpassword) 
  15.             if user: #原口令正确 
  16.                 if newpassword == newpassword1:#两次新口令一致 
  17.                     user.set_password(newpassword) 
  18.                     user.save() 
  19.                     print '1' 
  20.                     return HttpResponseRedirect(reverse("accounts.views.change_password_ok"))     
  21.                 else:#两次新口令不一致 
  22.                     template["word"] = '两次输入口令不一致'   
  23.                     template["form"] = form 
  24.                     print '2' 
  25.                     return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))  
  26.             else:  #原口令不正确 
  27.                 if newpassword == newpassword1:#两次新口令一致 
  28.                     template["word"] = '原口令不正确'   
  29.                     template["form"] = form 
  30.                     print '3' 
  31.                     return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request)) 
  32.                 else:#两次新口令不一致 
  33.                     template["word"] = '原口令不正确,两次输入口令不一致'   
  34.                     template["form"] = form 
  35.                     print '4' 
  36.                     return render_to_response("accounts/changepassword.html",template,context_instance=RequestContext(request))  
  37.     template["form"] = form         
  38.     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修改密码。

 
  
  1. python manage.py changepassword username 

具体效果如下图: