1. 程式人生 > >2018.12.21 Class274驗證器的例項

2018.12.21 Class274驗證器的例項

章節13

課時274

【後端開發】釋出新聞功能完成

實際開發中的登入驗證器

#froms.py
#encoding: utf-8
from django import forms
from apps.forms import FormMixin
from django.core.cache import cache
from .models import User

class LoginForm(forms.Form,FormMixin):
    telephone = forms.CharField(max_length=11)
    password = forms.CharField(max_length=20,min_length=6,error_messages={"max_length":"密碼最多不能超過20個字元!","min_length":"密碼最少不能少於6個字元!"})
    remember = forms.IntegerField(required=False)

上面的LoginForm的類是讓HTML驗證使用者的登入賬號和密碼。屬於後端的登入驗證。這裡的作用是,前端客戶輸入資料時,後端呼叫資料庫進行配對。


class RegisterForm(forms.Form,FormMixin):
    telephone = forms.CharField(max_length=11)
    username = forms.CharField(max_length=20)
    password1 = forms.CharField(max_length=20, min_length=6,
                               error_messages={"max_length": "密碼最多不能超過20個字元!", "min_length": "密碼最少不能少於6個字元!"})
    password2 = forms.CharField(max_length=20, min_length=6,
                                error_messages={"max_length": "密碼最多不能超過20個字元!", "min_length": "密碼最少不能少於6個字元!"})
    img_captcha = forms.CharField(min_length=4,max_length=4)
    sms_captcha = forms.CharField(min_length=4,max_length=4)

    def clean(self):
        cleaned_data = super(RegisterForm, self).clean()

        password1 = cleaned_data.get('password1')
        password2 = cleaned_data.get('password2')

        if password1 != password2:
            raise forms.ValidationError('兩次密碼輸入不一致!')

        img_captcha = cleaned_data.get('img_captcha')
        cached_img_captcha = cache.get(img_captcha.lower())
        if not cached_img_captcha or cached_img_captcha.lower() != img_captcha.lower():
            raise forms.ValidationError("圖形驗證碼錯誤!")

        telephone = cleaned_data.get('telephone')
        sms_captcha = cleaned_data.get('sms_captcha')
        cached_sms_captcha = cache.get(telephone)

        if not cached_sms_captcha or cached_sms_captcha.lower() != sms_captcha.lower():
            raise forms.ValidationError('簡訊驗證碼錯誤!')

        exists = User.objects.filter(telephone=telephone).exists()
        if exists:
            forms.ValidationError('該手機號碼已經被註冊!')

        return cleaned_data


這裡是重寫了整個驗證規則,從def clean開始就是把django的forms,moudels重寫了,用來驗證手機驗證碼,驗證圖片,最後是驗證客戶是否存在

自定義驗證:
有時候對一個欄位驗證,不是一個長度,一個正則表示式能夠寫清楚的,還需要一些其他複雜的邏
輯,那麼我們可以對某個欄位,進行自定義的驗證。比如在註冊的表單驗證中,我們想要驗證手機
號碼是否已經被註冊過了,那麼這時候就需要在資料庫中進行判斷才知道。