在經過django.forms.Forms建立表單字段時,其中每一個字段都有一些自定義的驗證邏輯和一些其餘鉤子前端
雖然表單字段的Field類主要使用在Form類中,但也能夠直接實例化來使用它們,以更好的瞭解它們是如何工做的,每一個Field的實例都有一個clean()方法,它接收一個參數,而後返回‘清潔的'數據或者拋出一個django.forms.ValidationError異常python
Field.clean(value)git
In [1]: from django import forms #建立一個字段 In [2]: f = forms.CharField() In [3]: f.clean('1') Out[3]: '1' In [4]: f.clean(1) Out[4]: '1' #CharField字段若是沒空則拋出異常 In [5]: f.clean('') ValidationError Traceback (most recent call last)
clean()方法一般用來對數據進行驗證和測試比較方便web
核心字段參數:正則表達式
每一個Field類構造函數均可用這些參數django
一、required服務器
Field.required:默認狀況下,Field類都必須判斷字段的值不能爲空值、None或者空的字符串(「」)那麼clean()將會引起ValidationError異常;只有在字段設置參數required=False則該字段的值不是必須的便可用爲空或None函數
In [6]: fr = forms.CharField() In [7]: fr.clean(None) --------------------------------------------------------------------------- ValidationError Traceback (most recent call last) In [8]: fq = forms.CharField(required=False) In [9]: fq.clean(None) Out[9]: '' In [10]: fq.clean("") Out[10]: ''
二、label測試
label參數用來給字段添加’人性化'的提示信息,如不指定則Field將因此下劃線轉換爲空格並將第一個字母大寫來生成標籤ui
from django import forms class CommentForm(forms.Form): name = forms.CharField(label='your name') url = forms.URLField(label='your website') commnet = forms.CharField() f = CommentForm(auto_id=False) #auto_id用來簡化輸出 print(f) #comment字段未指定label參數則使用字段名生成 <tr><th>your name:</th><td><input type="text" name="name" required></td></tr> <tr><th>your website:</th><td><input type="url" name="url" required></td></tr> <tr><th>Commnet:</th><td><input type="text" name="commnet" required></td></tr>
三、label_suffix
django默認爲label參數後面添加了冒號後綴,若是想自定義則可用使用label_suffix參數來指定替代符號
class conform(forms.Form): name = forms.CharField(label='姓名') rename = forms.CharField(label='姓名',label_suffix='==') f = conform(auto_id=False) print(f) <tr><th>姓名:</th><td><input type="text" name="name" required></td></tr> <tr><th>姓名==</th><td><input type="text" name="rename" required></td></tr>
四、initial
該initial參數容許Field在未綁定中呈現此內容時要使用的初始值
from django import forms class commentform(forms.Form): name = forms.CharField(initial='your name') url = forms.URLField(initial='http://') comment = forms.CharField() f = commentform(auto_id=False) print(f) <tr><th>Name:</th><td><input type="text" name="name" value="your name" required></td></tr> <tr><th>Url:</th><td><input type="url" name="url" value="http://" required></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
若是在初始表單時傳遞數據將觸發驗證,HTML輸出將包括任何驗證錯誤信息,因此initial僅爲未綁定表單數據時顯示值
from django import forms class commentform(forms.Form): name = forms.CharField(initial='your name') url = forms.URLField() data = {'name':"",'url':'http://www.baidu.com'} f = commentform(data,auto_id=False) print(f) <tr><th>Name:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="name" required></td></tr> <tr><th>Url:</th><td><input type="url" name="url" value="http://www.baidu.com" required></td></tr>
咱們也能夠傳遞任何可調用的變量做爲參數傳遞給initial,如如下實例咱們能夠傳遞一個如今的時間給參數做爲初始值
from django import forms import datetime class dateform(forms.Form): day = forms.DateField(initial=datetime.date.today) print(dateform(auto_id=False)) <tr><th>Day:</th><td><input type="text" name="day" value="2019-04-10" required></td></tr>
五、widget
最重要的參數之一,指定渲染Widget時使用的widget類,也就是在form字段在HTML頁面中是顯示爲文本輸入框、密碼框、單選按鈕或多選框等,此參數內容比較多,之後單篇文章詳細介紹
六、help_text
該參數用於設置字段的描述文本,它與模型字段中的hep_text同樣,它不會再自動生成的表單中進行HTML轉義
from django import forms class HelptextForm(forms.Form): name = forms.CharField(help_text='100 characters max.') sender = forms.EmailField(help_text='a email address.') f = HelptextForm(auto_id=False) print(f) <tr><th>Name:</th><td><input type="text" name="name" required><br><span class="helptext">100 characters max.</span></td></tr> <tr><th>Sender:</th><td><input type="email" name="sender" required><br><span class="helptext">a email address.</span></td></tr>
七、error_messages
該參數用於設置覆蓋字段將引起的默認異常消息,需傳入一個字典,其中的鍵與要覆蓋的錯誤信息相匹配
#如下是默認的異常信息 generic = forms.EmailField() generic.clean('') django.core.exceptions.ValidationError: ['This field is required.'] #下面經過error_messages自定義默認的異常信息 name = forms.EmailField(error_messages={'required':'please enter your email'}) name.clean('') django.core.exceptions.ValidationError: ['please enter your email']
八、validators
指定一個列表,其中包含爲字段進行驗證的函數,如,咱們自定義了驗證方法,不需熬Django內置的驗證功能,那麼久須要經過這個參數,將字段與自定義驗證的方法經過此參數來指定
九、localize
此參數幫助咱們實現表單數據輸入的本地化
十、disabled
設置由該屬性的字段在前端頁面中將顯示爲不可編輯的狀態
該參數接收布爾值,當設置爲True時,使用HTML的disabled屬性金庸表單域,使用戶沒法編輯該字段,即便非法篡改了前端頁面的屬性,相服務器提交該字段的值也將依然被忽略
十一、has_changed()
該方法用於肯定字段值是否已從初始值更改,返回True或False
內置Field類:對於每一個字段類,下面介紹其默認的Widget,當輸入爲空值時返回的值,以及蠶蛹何種驗證方法,‘規範化爲'表示轉換爲python的何種對象,可用的錯誤信息鍵,表示字段可自定義錯誤信息的類型(字典的鍵)
十二、BooleanField
默認的Widget:CheckboxInput
空值:False
規範化爲:Python的True或者False
可用的錯誤信息鍵:required
1三、CharField
默認的Widget:TextInput
空值:empty_value給出的任何值
規範化爲:Python的string
驗證max_length或min_length,若是設置了這兩個參數,不然全部的輸入都是合法的
可用的錯誤信息鍵:required,min_length,max_length
它有四個可選參數:max_length,min_length用來設置字符串的最大和最小長度;strip默認爲True,去除輸入的前導和尾隨空格;empty_value用來表示'空'的值,默認爲空字符串
1四、ChoiceField
默認的Widget:Select
空值:一個空字符串
規範化爲:python的string
驗證給定的值是否在選項列表中
可用的錯誤信息鍵:required,invalid_choice
參數:choices用來做爲該字段選項的一個二元組組成的可迭代對象
1五、TypedChoiceField
同ChoiceField同樣,只是多了兩個額外參數corece和empty_value
默認的Widget:Select
空值:empty_value參數設置的值
規範化爲:coerce參數類型的值
驗證給定的值在選項列表中存在而且能夠被強制轉換
可用的錯誤信息的鍵:required,invalid_choice
1六、DateField
默認的Widget:DateInput
空值:None
規範化爲:datetime.date對象
驗證給出的值時一個datetime.date,datetime.datetiem或指定日期格式的字符串
錯誤信息的鍵:required,invalid
接收一個可選的參數:input_formats,一個格式的列表,用於轉換字符串爲datetime.date對象,若是沒有提供input_formats默認端輸入格式爲:
['%Y-%m-%d', #'2019-4-10' '%m/%d/%Y', #'4/10/2019' '%m/%d/%y'] #'4/10/19'
此外,若是在設置中指定了USE_L10N=False,如下內容也將包含在默認格式中:
['%b %d %Y', # 'Oct 25 2006' '%b %d, %Y', # 'Oct 25, 2006' '%d %b %Y', # '25 Oct 2006' '%d %b, %Y', # '25 Oct, 2006' '%B %d %Y', # 'October 25 2006' '%B %d, %Y', # 'October 25, 2006' '%d %B %Y', # '25 October 2006' '%d %B, %Y'] # '25 October, 2006'
1七、DateTimeField
默認的Widget:DateTimeInput
空值:None
規範化爲:python的datetime.datetime對象
驗證給出的值時一個datetime.datetime、datetime.date或指定日期格式的字符串
錯誤信息的鍵:required,invalid
接收一個可選參數:input_formats,若是沒有提供input_formats默認的輸入格式爲:
['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d', # '2006-10-25' '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' '%m/%d/%Y %H:%M', # '10/25/2006 14:30' '%m/%d/%Y', # '10/25/2006' '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' '%m/%d/%y %H:%M', # '10/25/06 14:30' '%m/%d/%y'] # '10/25/06'
1八、DecimalField
默認的Widget:當Field.localize是False時爲NumberInput,不然爲TextInput
空值:None
規範化爲:python decimal對象
驗證給定的值爲一個十進制數,忽略前導和尾隨的空白
錯誤信息的鍵:max_whole_digits,max_digits,max_decimal_places,max_value,invalid,required,min_value
接收四個可選參數:
max_value,min_value:容許的值範圍,須要賦值decimal.Decimal對象,不能直接給個整數類型
max_digits:值容許的最大位數(小數點以前和以後的數字總共的位數,前導的零將被刪除)
decimal_places:容許的最大小數位
1九、DurationField
默認的Widget:TextInput
空值:None
規範化爲:python timedela
驗證給出的值是一個字符串,並且能夠轉換爲timedelta對象
錯誤信息的鍵:required,invalid
20、EmailField
默認的Widget:EmailInput
空值:''(一個空字符串)
規範化爲:Unicode 對象。
使用正則表達式驗證給出的值是一個合法的郵件地址。
錯誤信息的鍵:required, invalid
兩個可選的參數用於驗證,max_length 和min_length
2一、FileField
默認的Widget:ClearableFileInput
空值:None
規範化爲:一個UploadedFile對象,它封裝文件內容和文件名到一個對象內。
驗證非空的文件數據已經綁定到表單。
錯誤信息的鍵:missing, invalid, required, empty, max_length
具備兩個可選的參數用於驗證:max_length 和 allow_empty_file。
2二、FilePathField
默認的Widget:Select
空值:None
規範化爲:Unicode 對象。
驗證選擇的選項在選項列表中存在。
錯誤信息的鍵:required, invalid_choice
這個字段容許從一個特定的目錄選擇文件。 它有五個額外的參數,其中的path是必須的:
path:要列出的目錄的絕對路徑。 這個目錄必須存在。
recursive:若是爲False(默認值),只用直接位於path下的文件或目錄做爲選項。若是爲True,將遞歸訪問這個目錄,其內全部的子目錄和文件都將做爲選項。
match:正則表達模式;只有具備與此表達式匹配的文件名稱才被容許做爲選項。
allow_files:可選。默認爲True。表示是否應該包含指定位置的文件。它和allow_folders必須有一個爲True。
allow_folders可選。默認爲False。表示是否應該包含指定位置的目錄。
2三、FloatField
默認的Widget:當Field.localize是False時爲NumberInput,不然爲TextInput。
空值:None
規範化爲:Float 對象。
驗證給定的值是一個浮點數。
錯誤信息的鍵:max_value, invalid, required, min_value
接收兩個可選的參數用於驗證,max_value和min_value,控制容許的值的範圍。
2四、ImageField
默認的Widget:ClearableFileInput
空值:None
規範化爲:一個UploadedFile 象,它封裝文件內容和文件名爲一個單獨的對象。
驗證文件數據已綁定到表單,而且該文件是Pillow能夠解析的圖像格式。
錯誤信息的鍵:missing, invalid, required, empty, invalid_image
使用ImageField須要安裝Pillow(pip install pillow)。若是在上傳圖片時遇到圖像損壞錯誤,一般意味着使用了Pillow不支持的格式。
2五、IntegerField
默認的Widget:當Field.localize是False時爲NumberInput,不然爲TextInput。
空值:None
規範化爲:Python 整數或長整數。
驗證給定值是一個整數。 容許前導和尾隨空格,相似Python的int()函數。
錯誤信息的鍵:max_value, invalid, required, min_value
兩個可選參數:max_value和min_value,控制容許的值的範圍。
2六、GenericIPAddressField
包含IPv4或IPv6地址的字段。
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:一個Unicode對象。
驗證給定值是有效的IP地址。
錯誤信息的鍵:required, invalid
有兩個可選參數:protocol和unpack_ipv4
2七、MultipleChoiceField
默認的Widget:SelectMultiple
空值:[](一個空列表)
規範化爲:一個Unicode 對象列表。
驗證給定值列表中的每一個值都存在於選擇列表中。
錯誤信息的鍵:invalid_list, invalid_choice, required
2八、TypedMultipleChoiceField
相似MultipleChoiceField,除了須要兩個額外的參數,coerce和empty_value。
默認的Widget:SelectMultiple
空值:empty_value
規範化爲:coerce參數提供的類型值列表。
驗證給定值存在於選項列表中而且能夠強制。
錯誤信息的鍵:required, invalid_choice
2九、NullBooleanField
默認的Widget:NullBooleanSelect
空值:None
規範化爲:Python None, False 或True 值。
不驗證任何內容(即,它從不引起ValidationError)。
30、RegexField
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
驗證給定值與某個正則表達式匹配。
錯誤信息的鍵:required, invalid
須要一個必需的參數:regex,須要匹配的正則表達式。
還能夠接收max_length,min_length和strip參數,相似CharField。
3一、SlugField
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
驗證給定的字符串只包括字母、數字、下劃線及連字符。
錯誤信息的鍵:required, invalid
此字段用於在表單中表示模型的SlugField。
3二、TimeField
默認的Widget:TextInput
空值:None
規範化爲:一個Python 的datetime.time 對象。
驗證給定值是datetime.time或以特定時間格式格式化的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:input_formats,用於嘗試將字符串轉換爲有效的datetime.time對象的格式列表。
若是沒有提供input_formats,默認的輸入格式爲:
'%H:%M:%S', # '14:30:59' '%H:%M', # '14:30'
3三、URLField
默認的Widget:URLInput
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
驗證給定值是個有效的URL。
錯誤信息的鍵:required, invalid
可選參數:max_length和min_length
3四、UUIDField
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:UUID對象。
錯誤信息的鍵:required, invalid
3五、ComboField
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:Unicode 對象。
根據指定爲ComboField的參數的每一個字段驗證給定值。
錯誤信息的鍵:required, invalid
接收一個額外的必選參數:fields,用於驗證字段值的字段列表(按提供它們的順序)。
>>> from django.forms import ComboField >>> f = ComboField(fields=[CharField(max_length=20), EmailField()]) >>> f.clean('test@example.com') 'test@example.com' >>> f.clean('longemailaddress@example.com') Traceback (most recent call last): ... ValidationError: ['Ensure this value has at most 20 characters (it has 28).']
3六、MultiValueField
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:子類的compress方法返回的類型。
根據指定爲MultiValueField的參數的每一個字段驗證給定值。
錯誤信息的鍵:incomplete, invalid, required
3七、SplitDateTimeField
默認的Widget:SplitDateTimeWidget
空值:None
規範化爲:Python datetime.datetime 對象。
驗證給定的值是datetime.datetime或以特定日期時間格式格式化的字符串。
錯誤信息的鍵:invalid_date, invalid, required, invalid_time
3八、ModelChoiceField
默認小部件: Select
空值: None
規範化爲:模型實例。
驗證查詢集中是否存在給定的id。
錯誤消息鍵:required,invalid_choice
queryset必須參數指定一個QuerySet模型對象,並從中處處字段的選項
兩個可選參數:
empty_label:可用更改標籤文本或設置爲None來禁用空標籤
to_field_name:用於指定要用做字段窗口中選項的值的字段,以確保它是模型的惟一字段默認爲None將使用每一個對象的主鍵
3九、ModelMultipleChoiceField
默認小部件:SelectMultiple
空值:空QuerySet(self.queryset.none())
規範化爲:QuerySet模型實例
驗證查詢集中是否存在給定值列表中的每一個id。
錯誤信息鍵:required,list,invalid_choice, invalid_pk_value
queryset:必須參數,與ModelChoiceField.queryset相同
一個可選參數:
to_field_name:與ModelChoiceField.to_field_name相同
40、建立自定義字段
若是內置Field類不能知足您的需求,咱們能夠輕鬆建立自定義Field類,爲此只需建立一個dango.forms.Field子類,它的惟一要求是,必須實現一個clean()方法,並且其__init__()實現required,label,initial,widget,help_text方法