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中,定義的pwd欄位是這樣定義的另外定義表單驗證規則loginform類時,欄位名需要等於html中name值
pwd = forms.charfield(required=true,其中error_messages屬性是用來定義錯誤資訊的展示的。解釋為:如果required驗證不通過,則提示'密碼不能為空',min_length驗證不通過,則錯誤資訊為'至少6位'。擴充套件'invalid': '必須輸入數字'min_length=6,
max_length=10,
error_messages=)
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...