Form的含義及做用:html
用於驗證用戶請求數據合法性的一個組件(校驗數據的合法性)前端
Django的Form實現步驟:python
建立一個驗證用戶請求的模板git
from django import forms正則表達式
class MyForm( forms.Form):django
user = forms.CharField(......) input type='text'json
email = forms.EmailField(......) input type='email'後端
pwd = forms.PasswordField(......) input type='password'函數
類:模板,一共會驗證幾條數據ui
字段:用於驗證用戶某個字段
插件:user = forms.CharField(......widget=Input框) #各類框
獲取用戶驗證請求,進行驗證:
-- is_valid() 獲得True或False
-- clean() 獲取正確數據
-- errors 獲取錯誤信息
Form提交:
errors.字段.0
Ajax提交:
errors.as_json() 字符串類型數據
errors.as_data() 字典類型數據
{'user':[Django對象(),]}
field經常使用參數:
required = True, 是否必填(重要參數)
widget = None, HTML插件
label = None, 用於生成Label標籤或顯示內容(也可用於光標顯示)
initial = None, 初始值(重要參數)
help_text=' ', 幫助信息(在標籤旁邊顯示)
error_messages=None, 錯誤信息{'required':'不能爲空','invalid':'格式錯誤'}(重要參數)
show_hidden_initial=False, 是否在當前插件後再加一個隱藏的且具備默認值的插件(可用於檢驗兩次輸入是否一致)
validators=[], 自定義驗證規則(重要參數)
localize=False, 是否支持本地化
disabled=False, 是否能夠編輯
label_suffix=None, label內容後綴
注:error_messages裏面的key(code)能夠是如下信息出錯時的值 {code=min_length message='錯誤信息'}
CharField(Field):
max_length=None,最大長度;min_length=None,最小長度;strip=True,是否移除用戶輸入的空白;
IntegerField(Field):
max_value=None,最大值;min_value=None,最小值;max_digits=None,總長度;decimal_places=None,小數位長度
BaseTemporalField(Field):
input_formats=None,時間格式化;
DateField(BaseTemporalField) 格式:2019-12-09
TimeField(BaseTemporalField) 格式:18:51
DateTimeField(BaseTemporalField) 格式:2019-12-09 18:51
DurationField(Field) 時間間隔:%d %H:%M:%S.%f
RegexField(CharField):
regex,自定製正則表達式;max_length=None,最大長度;min_length=None,最小長度;error_message=None,忽略,錯誤信息使用 error_messages={'invalid':'...'}
EmailField(CharField),同理RegexField方法的使用方式相似
FileField(Field):
allow_empty_file=False,是否容許空文件
ImageField(Field):
注:須要PIL模塊,pip3 install Pillow 以上兩個字典使用時,須要注意兩點:
- form表單中 enctype = "multipart/form-data" - view函數中 obj = MyForm(request.POST,request.FILES) --->(若是信息和文件都要一塊兒接收要雙選)
ChoiceField(Field):
choices=[ ] 選項,如:choices = [(1,'上海'),(2,'北京'),(3,'成都'),]
required=True 是否必填
widget=None 插件,默認select插件
label = None, 用於生成Label標籤或顯示內容(也可用於光標顯示)
initial = None, 初始值(重要參數)
help_text=' ', 幫助信息(在標籤旁邊顯示)
TypedChoiceField(ChoiceField):
coerce = lambda val:val 對選中的值進行一次轉換
empty_value=' ' 空的默認值
MultipleChoiceField(): 多選框
ComboField(Field):
fields=[ ] 使用多個驗證,例:fields.ComboField(fields=[fields.CharField(max_length=20),fields.EmailField(),])
即驗證最大長度20,又驗證郵箱格式
MultiValueField(Field):
PS:抽象類,子類中能夠實現聚合多個字典去匹配一個值,要配合MultiWidget使用
指自定製驗證框(經過繼承實現自動生成多個須要的框)
FilePathField(ChoiceField) 文件選項,目錄下文件顯示在頁面中
path 文件夾路徑
match=None 正則匹配
recursive=False 遞歸下面的文件夾
allow_files=True 容許文件
allow_folders=False 容許文件夾
required=True 是否必填
widget=None 插件,默認select插件
label = None, 用於生成Label標籤或顯示內容(也可用於光標顯示)
initial = None, 初始值(重要參數)
help_text=' ', 幫助信息(在標籤旁邊顯示)
GenericIPAddressField
protocol='both', both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,若是是::ffff:192.0.2.1時,能夠解析爲192.0.2.1,PS:protocol必須爲both才能啓用
SlugField(CharField) 數字,字母,下劃線,減號(連字符)
UUIDField(CharField) uuid類型
注:UUID是根據MAC以及當前時間等建立的不重複的隨機字符串
例:
<!-- 前端代碼塊 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/index/" method="POST"> <p>{{ obj.user }}{{ obj.userID }}{{ obj.userChoice }}{{ obj.userChoice2 }}{{ obj.userChoice3 }}</p> <p>{{ obj.usertype }}{{ obj.userChoice4 }}</p> <p>{{ obj.usernull }}{{ obj.userlabel.label_tag }}{{ obj.userlabel }}</p> <p>{{ obj.userinitial }}{{ obj.uservalidators }}{{ obj.userdisable }}{{ obj.usererror }}</p> <p>{{ obj.usermultiple }}</p> <p><input type="submit" value="提交"></p> </form> </body> </html>
#後端代碼塊 #author:wylkjj #date:2019/12/9 from django.core.validators import RegexValidator from django.shortcuts import render from django import forms from django.forms import widgets #-*- coding:utf-8 -*- class myField(forms.Form): #password屬性框 user = forms.CharField(widget=widgets.PasswordInput) #text屬性框 userID = forms.CharField(widget=widgets.TextInput(attrs={'class':'txts','placeholder':'hello!'})) #添加屬性 #select屬性框第一種書寫方式:獲取到的值是默認的str類型 userChoice = forms.ChoiceField(choices=[(1,'上海'),(2,'北京'),(3,'成都'),]) #select屬性框第二種書寫方式: 結合IntegerField() 獲取int類型值 userChoice2 = forms.CharField(widget=widgets.Select(choices=[(1,'上海'),(2,'北京'),(3,'成都'),])) userChoice3 = forms.IntegerField(widget=widgets.Select(choices=[(1,'上海'),(2,'北京'),(3,'成都'),])) #返回值int屬性框 usertype = forms.IntegerField() #數據轉換 轉換爲數字類型,而不是字符串類型,選擇框的屬性 #互斥select屬性框 userChoice4 = forms.IntegerField(widget=widgets.RadioSelect(choices=[(1,'上海'),(2,'北京'),(3,'成都'),])) #是否容許字段值必填(默認狀況下required的值爲True,不容許字段無值) usernull = forms.CharField(required=True) #顯示參數添加光標(label) userlabel = forms.CharField(label="光標") #初始值 userinitial = forms.CharField(initial="ppt") #自定義驗證規則(可指定code的名) uservalidators = forms.CharField(initial="ppt",validators=[RegexValidator(r'^[0-9]+$','11111',code='f1')]) #是否能夠進行編輯 userdisable = forms.CharField(initial="ppt",disabled=True) #錯誤信息 usererror = forms.CharField(initial="ppt", max_length=6, validators=[RegexValidator(r'^[0-9]+$','11111',code='f1')], error_messages={'required':'不容許爲空', 'invalid':'格式錯誤', 'f1':'asd', 'max_length':'ChaoGuoZuiDaChangDu'}) #多選框 usermultiple = forms.MultipleChoiceField( initial=[1,2], #初始選中值 choices=[(1,'上海'),(2,'北京'),(3,'成都'),]) def index(request): if request.method == "GET": obj = myField() return render(request, "index.html", {"obj": obj}) elif request.method == "POST": obj = myField(request.POST) obj.is_valid() print(obj.clean()) return render(request, "index.html", {"obj": obj})