django表單字段

在經過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方法

相關文章
相關標籤/搜索