Django ModelForm中使用鉤子函式校驗資料
ModelForm中使用鉤子函式校驗資料
class RegisterForm(forms.ModelForm):
password = forms.CharField(label='密碼', widget=forms.PasswordInput(), min_length=6, max_length=32, error_messages={'min_length': '密碼長度不能小於6個字元', 'max_length': '密碼長度不能大於32個字元'})
re_password = forms.CharField(label='確認密碼', widget=forms.PasswordInput(), min_length=6, max_length=32, error_messages={'min_length': '密碼長度不能小於6個字元', 'max_length': '密碼長度不能大於32個字元'})
phone = forms.CharField(label='手機號', validators=[RegexValidator(r'^(1[3|4|5|6|7|8|9])\d{9}$', '手機號格式錯誤')])
code = forms.CharField(label='驗證碼', widget=forms.TextInput())
class Meta:
model = models.User
fields = ['username', 'password', 're_password', 'email', 'phone', 'code']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = '請輸入{}'.format(field.label)
# 驗證使用者名稱
def clean_username(self):
# 校驗資料前,都需要獲取到被校驗的資料
username = self.cleaned_data['username']
# 開始校驗:判斷資料庫中是否已存在使用者名稱
exists = models.User.objects.filter(username=username).exists()
if exists:
raise ValidationError('使用者名稱已存在')
return username
# 驗證郵箱
def clean_email(self):
email = self.cleaned_data['email']
exists = models.User.objects.filter(email=email).exists()
if exists:
raise ValidationError('郵箱已存在')
return email
# 加密密碼
def clean_password(self):
pwd = self.cleaned_data['password']
return md5(pwd)
# 驗證確認密碼
def clean_re_password(self):
pwd = self.cleaned_data['password']
re_pwd = md5(self.cleaned_data['re_password'])
if pwd != re_pwd:
raise ValidationError('兩次密碼不一致')
return re_pwd
# 驗證手機號
def clean_phone(self):
phone = self.cleaned_data['phone']
exists = models.User.objects.filter(phone=phone).exists()
if exists:
raise ValidationError('手機號已被註冊')
return phone
# 驗證code
def clean_code(self):
code = self.cleaned_data['code']
phone = self.cleaned_data['phone']
# 連線redis
conn = get_redis_connection()
# 獲取redis中儲存的資料{'phone': 'code'}
redis_code = conn.get(phone)
if not redis_code:
raise ValidationError('驗證碼失效或未傳送,請重新傳送')
redis_str_code = redis_code.decode('utf-8')
# 判斷輸入的code是否等於redis儲存的code
if code.strip() != redis_str_code:
raise ValidationError('驗證碼錯誤,請重新輸入')
return code
相關文章
- JVM鉤子函式的使用JVM函式
- [Django REST framework - 序列化元件、source、鉤子函式]DjangoRESTFramework元件函式
- WINDOWS鉤子函式(轉)Windows函式
- VC:滑鼠鉤子函式函式
- Django Forms元件,展示使用者輸入不合規的提示資訊,鉤子函式DjangoORM元件函式
- Vue生命週期鉤子函式Vue函式
- Django中F函式的使用Django函式
- Django之ModelFormDjangoORM
- 140 form自定錯誤和鉤子,django中cookie的使用ORMDjangoCookie
- Vue 生命週期與鉤子函式Vue函式
- 鉤子函式的執行機理函式
- before-after-hook鉤子函式Hook函式
- 訊息鉤子函式入門篇函式
- vue所有生命週期函式/鉤子函式理解Vue函式
- JavaScript:鉤子函式與回撥函式的區別JavaScript函式
- 行式填報 資料校驗 --- 小計校驗
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- django專案基於鉤子驗證的註冊功能Django
- webpack 4.0 Tapable 類中的常用鉤子函式原始碼分析Web函式原始碼
- 訊息鉤子函式入門篇 (轉)函式
- orm中使用modelForm新增資料ORM
- DW中的資料校驗
- Django中 render() 函式的使用方法Django函式
- 使用 voluptuous 校驗資料
- Hive Query生命週期 —— 鉤子(Hook)函式篇HiveHook函式
- Vue的鉤子函式[路由導航守衛、keep-alive、生命週期鉤子]Vue函式路由Keep-Alive
- django中的url函式Django函式
- Angular2生命週期鉤子函式Angular函式
- 資料校驗
- MySQL手動資料校驗+雲資料庫資料校驗MySql資料庫
- django Form元件校驗流程DjangoORM元件
- 這才是tapable裡面SyncLoopHook鉤子函式的實現OOPHook函式
- 瞭解React Hooks及其常用的幾個鉤子函式ReactHook函式
- Nuxt3 的生命週期和鉤子函式(一)UX函式
- Nuxt3 的生命週期和鉤子函式(二)UX函式
- Nuxt3 的生命週期和鉤子函式(三)UX函式
- Nuxt3 的生命週期和鉤子函式(四)UX函式
- Nuxt3 的生命週期和鉤子函式(五)UX函式