Django項目實戰 - 重置密碼功能


本章重點:

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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
        <input type="text" id="account" name="email" value="{{ forget_form.email.value }}" placeholder="郵箱" />
    </div>
    <div class="form-group captcha1 marb38">
        <label>&nbsp;&nbsp;</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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM