【前置課程】蘊含在Django中的MTV模式
任何一個系統對于網絡數據的提交都希望達到一定的“正確性”。無論是確保數據本身的真實性還是引導用戶輸入系統允許的數據,數據驗證,是一個不得不關注的問題。
比如最早期的STRUTS、STRUTS 2,直至今日的 Spring MVC 等 WEB 框架中對于服務器端數據驗證都提供了相應的解決方案。
處理數據驗證本身就是一個復雜的業務。Django 提供的 Form 功能簡單易用,而且 Django 認為自帶的 Form 處理會比大多數程序員自己編寫代碼處理要來得更安全。
示例代碼
def myform(request):
if request.method == 'GET':
return render(request, "form.html")
elif request.method == 'POST':
js_id = request.POST['js_id'] #簡書ID
age = request.POST['age'] #年齡
user = UserInfo()
user.js_id = js_id
user.age = age
user.save() #保存數據
return render(request, "form.html", {'success': 'success'})
提問:上面的代碼存在哪些不足?【age】信息是必填的嗎?如果填寫了是一個負數這樣的數據還有效嗎?【js_id】的真實長度超過了100怎么辦?
【5分鐘】普通Form類的使用
forms.py的代碼:
# _*_ coding: utf-8 _*_
from django import forms
class UserInfoForm(forms.Form):
js_id = forms.CharField(label="簡書id",error_messages={'required': '請輸入簡書ID'})
age = forms.IntegerField(label="年齡")
# 省略其他要驗證的字段內容
def clean_age(self):
age = self.cleaned_data['age']
if age < 0:
raise forms.ValidationError("年齡范圍填寫錯誤")
return age
views.py的代碼:
def myform(request):
if request.method == 'GET':
return render(request, "form.html")
elif request.method == 'POST':
userInfoForm = UserInfoForm(request.POST)
if userInfoForm.is_valid():
pass #寫保存數據的代碼
return render(request, "form.html", {'success': 'success'})
else:
return render(request, "form.html", {
'errors': userInfoForm.errors
})
講解:
定義Form類和Form字段(和model中的字段有什么關系嗎?)
Form類的常用屬性和方法,is_valid()函數,errors屬性
【5分鐘】ModelForm的使用
如果你要創建由數據庫驅動的app,那么你使用的Form將很接近你創建的Model。
比如我們的【UserInfo】Model,里面所有字段和我們的Form是一樣的,那么我們就可以直接使用Model的定義來驗證Form里的字段。
從官方文檔我們可以發現,每一個Form字段類型與之對應一個Model的字段類型。當然,除了【AutoField】等特定的Model字段類型對于Form來說是不需要的。
forms.py的代碼:
from django import forms
from message.models import UserInfo
class UserInfoForm(forms.ModelForm):
class Meta:
model = UserInfo
fields = "__all__"
exclude = ['create_time']
views.py的代碼:
…… 省略 ……
if request.method == 'POST':
user_info_form = UserInfoForm(request.POST)
if user_info_form.is_valid():
userInfo = user_info_form.save(commit=True)
return render(request, "success.html", {})
…… 省略 ……
講解:
class Meta 的定義方式以及 ModelForm 和 Model 的關系。
常用 Meta 屬性的配置方法
【5分鐘】模版中表單的渲染(view、form、html代碼僅供參考)
html的代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>根據Form生成表單</title>
</head>
<body>
{{ form.as_p }}
</body>
</html>
forms.py的代碼:
# _*_ coding: utf-8 _*_
from django import forms
class UserInfoForm(forms.Form):
js_id = forms.CharField(label="簡書id")
age = forms.IntegerField(label="年齡")
views.py的代碼:
def newform(request):
form = UserInfoForm()
return render(request, 'index.html', {'form': form})
運行效果:
從瀏覽器查看頁面源碼:
HTML中的Form也是可以生成的!~
幾個重點函數掌握:
.is_valid():返回True或者False,用于驗證綁定了數據的Form是否通過的驗證。
.cleaned_data:通過驗證后的數據,f.cleaned_data['age']來取具體通過驗證的某個值。
.errors:error封裝所有的錯誤信息,如果沒有獲取到,默認為None。
_clean():field_clean()函數編寫定制化驗證的函數。