本章重點:
1. 需要用到兩個html頁面: 忘記密碼.html 重置密碼.html
2. 每個頁面都有一個Form表單,因此需要在forms.py中創建兩個類: ForgetPwdForm ModifyPwdForm
3. 需要創建三個url: forgeturl, reseturl, modifyurl
4. 需要在Views.py中創建三個View: ForgetPwdView, ResetView, ModifyPwdView
有疑問的地方是,為什么需要創建三個url,和三個view,是因為:
ResetView 負責get方法,Resetview接收url中的code到數據庫取出對應的用戶email,然后回傳到html頁面中。
ModifyPwdView 負責post方法,需要從html頁面中取出用戶email和密碼,然后提交給后台數據庫保存。
5. Django要求user表中的密碼時需要加密的,否則無法登錄,因此需要用到make_password這個函數來對密碼進行加密:
from django.contrib.auth.hashers import make_password
下面是詳細代碼:
forms.py中創建的兩個 Form
class ForgetPwdForm(forms.Form): email = forms.EmailField(required=True) captcha = CaptchaField(error_messages={"invalid": u"驗證碼錯誤"}) class ModifyPwdForm(forms.Form): password1 = forms.CharField(required=True, min_length=6) password2 = forms.CharField(required=True, min_length=6)
views.py中創建的三個view
class ForgetPwdView(View): def get(self, request): forget_form = ForgetPwdForm() return render(request, "forgetpwd.html", {"forget_form": forget_form}) def post(self, request): forget_form = ForgetPwdForm(request.POST) if forget_form.is_valid(): email = request.POST.get("email", "") send_register_email(email, "forget") return render(request, "send_success.html") else: return render(request, "forgetpwd.html", {"forget_form": forget_form}) class ResetView(View): """ 密碼重置功能 """ def get(self, request, active_code): all_records = EmailVerifyRecord.objects.filter(code=active_code) if all_records: for record in all_records: email = record.email return render(request, "password_reset.html", {"email": email}) else: return render(request, "active_fail.html") return render(request, "login.html") class ModifyPwdView(View): def post(self, request): modify_form = ModifyPwdForm(request.POST) if modify_form.is_valid(): pwd1 = request.POST.get("password1", "") pwd2 = request.POST.get("password2", "") email = request.POST.get("email", "") if pwd1 != pwd2: return render(request, "password_reset.html", {"email": email, "msg": u"密碼不一致"}) user = UserProfile.objects.get(email=email) user.password = make_password(pwd1) user.save() return render(request, "login.html") else: email = request.POST.get("email", "") return render(request, "password_reset.html", {"email": email, "modify_form": modify_form})
urls.py中配置的三個url
url(r'^forget/$', ForgetPwdView.as_view(), name="forget_pwd"), url(r'^reset/(?P<active_code>.*)/$', ResetView.as_view(), name="reset_pwd"), url(r'^modify_pwd/$', ModifyPwdView.as_view(), name="modify_pwd"),
forgetpwd.html
<form id="jsFindPwdForm" method="post" action="{% url "forget_pwd" %}" autocomplete="off"> <div class="form-group marb20 {% if forget_form.errors.email %}errorput{% endif %}"> <label>帳 號</label> <input type="text" id="account" name="email" value="{{ forget_form.email.value }}" placeholder="郵箱" /> </div> <div class="form-group captcha1 marb38"> <label>驗 證 碼</label> {{ forget_form.captcha }} </div> <div class="error btns" id="jsForgetTips">{% for key,error in forget_form.errors.items %}{{ error }}{% endfor %}</div> <input type="hidden" name="sms_type" value="1"> <input class="btn btn-green" id="jsFindPwdBtn" type="submit" value="提交" /> <p class="form-p" style="bottom:40px;">您還可以<a href="{% url "login" %}"> [直接登錄]</a></p> {% csrf_token %} </form>
password_reset.html
需要注意的是創建了一個 hidden type的 input,用來ResetView將用戶的email傳遞到頁面中,ModifyPwdView來取用戶的email.
<form id="reset_password_form" action="{% url "modify_pwd" %}" method="post"> <ul> <li> <span class="">新 密 碼 :</span> <input type="password" name="password1" id="pwd" placeholder="6-20位非中文字符"> <i></i> </li> <input type="hidden" name="email" value="{{ email }}"> <li> <span class="">確定密碼:</span> <input type="password" name="password2" id="repwd" placeholder="6-20位非中文字符"> <i></i> </li> <li class="button"> <input type="submit" value="提交"> </li> </ul> {% csrf_token %} </form>