Django(part46)--form表单验证
學(xué)習(xí)筆記,僅供參考
文章目錄
- form表單驗(yàn)證
- 舉個(gè)例子
form表單驗(yàn)證
form提供表單和字段驗(yàn)證,我們可以使用form.is_valid() 方法進(jìn)行表單驗(yàn)證,若該方法返回值為True,則表示當(dāng)前表單合法,若返回值為False,則說明表單驗(yàn)證出現(xiàn)問題。
注意!這里,以及下面的form指的是forms.Form類的對(duì)象。
舉個(gè)例子
我們基于上一個(gè)Blog里的mywebsite_bookstore項(xiàng)目,舉一個(gè)例子來學(xué)習(xí)form表單驗(yàn)證。
如果我們沒有進(jìn)行表單驗(yàn)證操作,那么,當(dāng)我們進(jìn)行注冊(cè)時(shí),姓名可以填寫任意格式和任意長(zhǎng)度的數(shù)據(jù),這顯然不符合一般的填寫要求,且不方便我們處理:
為了使用戶規(guī)范的填寫注冊(cè)信息,我們需要進(jìn)行表單驗(yàn)證,即不按照規(guī)范進(jìn)行信息填寫,就注冊(cè)不成功
在userinfo應(yīng)用下的views.py模塊中,我們對(duì)視圖函數(shù)test_form進(jìn)行修改,增加一個(gè)表單驗(yàn)證功能:
def test_form(request):if request.method == "GET":myform = forms.RegForm()#創(chuàng)建對(duì)象return render(request, 'userinfo/test_form.html',locals())elif request.method == "POST":myform = forms.RegForm(request.POST)if myform.is_valid():#檢驗(yàn)表單中數(shù)據(jù)是否合法print(myform.cleaned_data)#輸出表單類中所有屬性值組成的字典return HttpResponse("<h2>表單提交成功!</h2> <br>" + str(myform.cleaned_data))else:return HttpResponse("<h2>表單數(shù)據(jù)驗(yàn)證失敗!</h2>")注意!若想要myform.is_valid()方法返回True,則需要下面3個(gè)條件同時(shí)驗(yàn)證成功:
- 對(duì)forms.xxxField()方法中的參數(shù)值進(jìn)行驗(yàn)證,驗(yàn)證成功返回None,驗(yàn)證失敗拋出forms.ValidationError異常
- 對(duì)form.clean_屬性名(self)方法中的屬性進(jìn)行驗(yàn)證,驗(yàn)證成功返回屬性值,驗(yàn)證失敗拋出forms.ValidationError異常
- 對(duì)form.clean(self)方法(表單的整體結(jié)構(gòu))進(jìn)行驗(yàn)證,驗(yàn)證成功返回 self.cleaned_data,驗(yàn)證失敗拋出forms.ValidationError異常
現(xiàn)在,我們編輯forms.py,添加兩個(gè)方法,進(jìn)行驗(yàn)證:
# -*- coding: utf-8 -*- from django import formsclass RegForm(forms.Form):username = forms.CharField(label = "輸入昵稱")password = forms.CharField(label = "輸入密碼",widget=forms.PasswordInput)passwordRepeat = forms.CharField(label = "再次輸入密碼",widget=forms.PasswordInput)tele = forms.CharField(label = "手機(jī)號(hào)", required = False)email = forms.CharField(label = "郵箱", required = False,widget=forms.EmailInput)#<input type="text">def clean_username(self):#對(duì)單個(gè)屬性進(jìn)行檢驗(yàn)username = self.cleaned_data["username"]if (len(username) < 6) | (len(username) > 12):raise forms.ValidationError("用戶名必須在6~12個(gè)字符之間!")return usernamedef clean(self):#屬性之間進(jìn)行檢驗(yàn)(整體檢驗(yàn))pwd1 = self.cleaned_data["password"]pwd2 = self.cleaned_data["passwordRepeat"]if pwd1 != pwd2:raise forms.ValidationError("兩次輸入不一致!")return self.cleaned_data注意,views.py模塊中test_form視圖方法里的is_valid()方法會(huì)自動(dòng)調(diào)用clean_username函數(shù)和clean函數(shù)。
我們向http://127.0.0.1:8000/userinfo/test_form/發(fā)起請(qǐng)求,并填寫符合要求的注冊(cè)信息:
點(diǎn)擊注冊(cè),顯示表單提交成功:
當(dāng)我們填寫的用戶名大于12個(gè)字符時(shí),再點(diǎn)擊注冊(cè),Django就會(huì)提示我們驗(yàn)證失敗:
總結(jié)
以上是生活随笔為你收集整理的Django(part46)--form表单验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唯美带君字的有诗意古风网名466个
- 下一篇: Django(part47)--文件上传