Python菜鳥之路 Django 表單驗證

2022-08-04 01:03:15 字數 4758 閱讀 3200

django中完成表單驗證,常用的有兩種方法:

一種是通過html + js + ajax實現。

另一種是通過django自身的forms模組來生成相應個html標籤來完成表單驗證。這是本節著重講的地方 

raise validationerror('手機號碼格式錯誤')

這裡邊views中,已經用到了django自帶的forms模組。在不用這個模組之前,我們對於使用者輸入進行判斷,需要一堆的if..if...if語句來進行,但是用了這個模組之後,僅需要在定義好loginform類中每個欄位的屬性後,通過obj = loginform(request.post)和ret = obj.is_valid()兩步,就可以完成對於使用者輸入資訊的驗證。ret會返回驗證是否全部通過。全部通過則為true,只要有一條表單資訊驗證不通過,則為false。

這裡需要關注的知識點是:obj.clean() 是輸出使用者post的正確資訊,是乙個dict,obj.errors是輸出使用者post的錯誤資訊,是乙個通過ul li顯示的資訊,這樣不方便檢視。可以通過obj.errors.as_json()來將錯誤資訊以json形式展示,用error_str = obj.errors.as_json() 和 result['message'] = json.loads(error_str)來完成錯誤資訊收集。

另外定義表單驗證規則loginform類時,欄位名需要等於html中name值

補充知識點:在定義的loginform中,定義的pwd欄位是這樣定義的

pwd = forms.charfield(required=true,

min_length=6,

max_length=10,

error_messages=)

其中error_messages屬性是用來定義錯誤資訊的展示的。解釋為:如果required驗證不通過,則提示'密碼不能為空',min_length驗證不通過,則錯誤資訊為'至少6位'。擴充套件'invalid': '必須輸入數字'

forms能解決的2個問題:

問題1: 如果使用html自帶的form標籤來進行提交,如果提交的資料有錯誤,會清空表單中的全部資料,如果表單項較多,對使用者非常不友好。那麼forms模組就能解決這個問題。

問題2: 使用html的form標籤提交資料,需要input標籤的name屬性必須和定義的class類的屬性一致。而使用django forms模組,則不需要考慮這個問題。  

廢話不多說,直接貼**

前端**

後端**

raise validationerror('手機號碼格式錯誤')

class loginform(forms.form):

user = forms.charfield(required=true, error_messages=)

pwd = forms.charfield(required=true,

min_length=6,

max_length=10,

error_messages=)

num = forms.integerfield(error_messages=)

phone = forms.charfield(validators=[mobile_validate, ],)

#test = forms.charfield(widget=forms.textarea(attrs=))

test_choices = (

(0, '上海'),

(1, '背景'),

)test = forms.integerfield(widget=forms.select(choices=test_choices))

def login(request):

if request.post:

objpost = loginform(request.post)

ret = objpost.is_valid()

if ret:

print(objpost.clean())

else:

from django.forms.utils import errordict

#print(type(obj.errors),obj.errors.as_json())

# obj1.errors

pass

return render(request, 'login.html',)

else:

objget = loginform()

return render(request, 'login.html',)

from django.conf.urls import url

urlpatterns = [

url(r'^login/', views.login),

]urls.py

知識點:如何生成自定義的標籤型別

forms預設幫我們生成的是input標籤,同時也支援生成其他標籤。在源**中,可以看到支援很多的field型別

上邊的一堆類可以看出,繼承field的類,可以用作生成標籤,這些類都寫在fields.py檔案中。而forms.integerfield(widget=forms.select(choices=test_choices)中的widget欄位中的類,都需要繼承自widget才可以,這些類都寫在widgets.py中。

比如,如果生成下拉框可以這麼寫:

test_choices = (

(0, '上海'),

(1, '背景'),

)test = forms.integerfield(widget=forms.select(choices=test_choices))

知識點:如何給生成的標籤自定義屬性

test = forms.charfield(widget=forms.textarea(attrs=))

python 菜鳥學習之路

day 2 函式的引數 預設引數可以簡化函式的呼叫。必選引數在前,預設引數在後,否則python的直譯器會報錯,函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。定義預設引數要牢記一點 預設引數必須指向不變物件!給定一組數字a,b,c 請計算a 2 b 2 ...

Python菜鳥之路 Python基礎

上述內容含義 python官方宣告 python2.7系列將會在2020年終止支援,並申明官方不會有2.8版本的發行版,請使用者盡快移動到python3.4 的開發環境中。由此可見,我們現在就邁向學習3.0系列,是很明智的 我身邊絕大多數都在用python2.7,對於3.0的差異性了解不多 二 py...

Python菜鳥入門之路 4

今天的題目 學習的知識點 這個在剛開始學完語法的時候,因為對網頁的興趣,就直接先學習了django,而且還專門練習了乙個星期,所以說今天做這道題還是比較容易的,主要的知識點 1.django專案的建立以及配置 2.表單的提交,涉及到與後端資料庫的互動 3.頁面重定向 httpresponseredi...