1. 程式人生 > >Django表單欄位彙總

Django表單欄位彙總

Field.clean(value)[source]

雖然表單欄位的Field類主要使用在Form類中,但也可以直接例項化它們來使用,以便更好地瞭解它們是如何工作的。每個Field的例項都有一個clean()方法,它接受一個引數,然後返回“清潔的”資料或者丟擲一個django.forms.ValidationError異常:

>>> from django import forms
>>> f = forms.EmailField() >>> f.clean('[email protected]') '[email protected]
' >>> f.clean('invalid email address') Traceback (most recent call last): ... ValidationError: ['Enter a valid email address.']

這個clean方法經常被我們用來在開發或測試過程中對資料進行驗證和測試。

一、核心欄位引數

以下的引數是每個Field類都可以使用的。

1. required

給欄位新增必填屬性,不能空著。

>>> from django import forms
>>> f = forms.CharField() >>> f.clean('foo') 'foo' >>> f.clean('') Traceback (most recent call last): ... ValidationError: ['This field is required.'] >>> f.clean(None) Traceback (most recent call last): ... ValidationError: ['This field is required.'] >>> f.clean(' ') ' ' >>> f.clean(0) '0' >>> f.clean(True) 'True' >>> f.clean(False) 'False' 

若要表示一個欄位不是必需的,設定required=False:

>>> f = forms.CharField(required=False)
>>> f.clean('foo')
'foo'
>>> f.clean('')
''
>>> f.clean(None)
''
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'

2. label

label引數用來給欄位新增‘人類友好’的提示資訊。如果沒有設定這個引數,那麼就用欄位的首字母大寫名字。比如:

下面的例子,前兩個欄位有,最後的comment沒有label引數:

>>> from django import forms
>>> class CommentForm(forms.Form): ... name = forms.CharField(label='Your name') ... url = forms.URLField(label='Your website', required=False) ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) <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" /></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr> 

3. label_suffix

Django預設為上面的label引數後面加個冒號字尾,如果想自定義,可以使用label_suffix引數。比如下面的例子用“?”代替了冒號:

>>> class ContactForm(forms.Form):
...     age = forms.IntegerField()
...     nationality = forms.CharField()
...     captcha_answer = forms.IntegerField(label='2 + 2', label_suffix=' =')
>>> f = ContactForm(label_suffix='?')
>>> print(f.as_p())
<p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" required /></p> <p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" required /></p> <p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" required /></p> 

4. initial

為HTML頁面中表單元素定義初始值。也就是input元素的value引數的值,如下所示:

>>> 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頁面將包含驗證中產生的錯誤,如下所示:

>>> class CommentForm(forms.Form):
...     name = forms.CharField()
...     url = forms.URLField()
...     comment = forms.CharField()
>>> default_data = {'name': 'Your name', 'url': 'http://'}
>>> f = CommentForm(default_data, 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><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" required /></td></tr> <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" required /></td></tr> 

這就是為什麼initial引數只用在未繫結的表單上。

還要注意,如果提交表單時某個欄位的值沒有填寫,initial的值不會作為“預設”的資料。initial值只用於原始表單的顯示:

>>> class CommentForm(forms.Form):
...     name = forms.CharField(initial='Your name')
...     url = forms.URLField(initial='http://')
...     comment = forms.CharField()
>>> data = {'name': '', 'url': '', 'comment': 'Foo'}
>>> f = CommentForm(data)
>>> f.is_valid()
False
# The form does *not* fall back to using the initial values.
>>> f.errors
{'url': ['This field is required.'], 'name': ['This field is required.']}

除了常量之外,你還可以傳遞一個可呼叫的物件:

>>> import datetime
>>> class DateForm(forms.Form): ... day = forms.DateField(initial=datetime.date.today) >>> print(DateForm()) <tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" required /><td></tr> 

5. widget

最重要的引數之一,指定渲染Widget時使用的widget類,也就是這個form欄位在HTML頁面中是顯示為文字輸入框?密碼輸入框?單選按鈕?多選框?還是別的....

6. help_text

該引數用於設定欄位的輔助描述文字。

>>> from django import forms
>>> class HelpTextContactForm(forms.Form): ... subject = forms.CharField(max_length=100, help_text='100 characters max.') ... message = forms.CharField() ... sender = forms.EmailField(help_text='A valid email address, please.') ... cc_myself = forms.BooleanField(required=False) >>> f = HelpTextContactForm(auto_id=False) >>> print(f.as_table()) <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" required /><br /><span class="helptext">100 characters max.</span></td></tr> <tr><th>Message:</th><td><input type="text" name="message" required /></td></tr> <tr><th>Sender:</th><td><input type="email" name="sender" required /><br />A valid email address, please.</td></tr> <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> >>> print(f.as_ul())) <li>Subject: <input type="text" name="subject" maxlength="100" required /> <span class="helptext">100 characters max.</span></li> <li>Message: <input type="text" name="message" required /></li> <li>Sender: <input type="email" name="sender" required /> A valid email address, please.</li> <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> >>> print(f.as_p()) <p>Subject: <input type="text" name="subject" maxlength="100" required /> <span class="helptext">100 characters max.</span></p> <p>Message: <input type="text" name="message" required /></p> <p>Sender: <input type="email" name="sender" required /> A valid email address, please.</p> <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> 

7. error_messages

該引數允許你覆蓋欄位引發異常時的預設資訊。 傳遞的是一個字典,其鍵為你想覆蓋的錯誤資訊。 例如,下面是預設的錯誤資訊:

>>> from django import forms
>>> generic = forms.CharField() >>> generic.clean('') Traceback (most recent call last): ... ValidationError: ['This field is required.'] 

而下面是自定義的錯誤資訊:

>>> name = forms.CharField(error_messages={'required': 'Please enter your name'})
>>> name.clean('')
Traceback (most recent call last):
  ...
ValidationError: ['Please enter your name']

可以指定多種型別的鍵,不僅僅針對‘requeired’錯誤,參考下面的內容。

8. validators

指定一個列表,其中包含了為欄位進行驗證的函式。也就是說,如果你自定義了驗證方法,不用Django內建的驗證功能,那麼要通過這個引數,將欄位和自定義的驗證方法連結起來。

9. localize

localize引數幫助實現表單資料輸入的本地化。

10. disabled

設定有該屬性的欄位在前端頁面中將顯示為不可編輯狀態。

該引數接收布林值,當設定為True時,使用HTML的disabled屬性禁用表單域,以使使用者無法編輯該欄位。即使非法篡改了前端頁面的屬性,向伺服器提交了該欄位的值,也將依然被忽略。

二、 Django表單內建的Field類

對於每個欄位類,介紹其預設的widget,當輸入為空時返回的值,以及採取何種驗證方式。‘規範化為’表示轉換為PYthon的何種物件。可用的錯誤資訊鍵,表示該欄位可自定義錯誤資訊的型別(字典的鍵)。

1. BooleanField

  • 預設的Widget:CheckboxInput
  • 空值:False
  • 規範化為:Python的True或者False
  • 可用的錯誤資訊鍵:required

2. CharField

  • 預設的Widget:TextInput
  • 空值:與empty_value給出的任何值。
  • 規範化為:一個Unicode 物件。
  • 驗證max_lengthmin_length,如果設定了這兩個引數。 否則,所有的輸入都是合法的。
  • 可用的錯誤資訊鍵:min_length, max_length, required

有四個可選引數:

  • max_length,min_length:設定字串的最大和最小長度。
  • strip:如果True(預設),去除輸入的前導和尾隨空格。
  • empty_value:用來表示“空”的值。 預設為空字串。

3. ChoiceField

  • 預設的Widget:Select
  • 空值:''(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定的值是否在選項列表中。
  • 可用的錯誤資訊鍵:required, invalid_choice

引數choices:用來作為該欄位選項的一個二元組組成的可迭代物件(例如,列表或元組)或者一個可呼叫物件。格式與用於和ORM模型欄位的choices引數相同。

4. TypedChoiceField

像ChoiceField一樣,只是還有兩個額外的引數:coerce和empty_value。

  • 預設的Widget:Select
  • 空值:empty_value引數設定的值。
  • 規範化為:coerce引數型別的值。
  • 驗證給定的值在選項列表中存在並且可以被強制轉換。
  • 可用的錯誤資訊的鍵:required, invalid_choice

5. DateField

  • 預設的Widget:DateInput
  • 空值:None
  • 規範化為:datetime.date物件。
  • 驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字串。
  • 錯誤資訊的鍵:required, invalid

接收一個可選的引數:input_formats。一個格式的列表,用於轉換字串為datetime.date物件。

如果沒有提供input_formats,預設的輸入格式為:

['%Y-%m-%d',      # '2006-10-25'
 '%m/%d/%Y',      # '10/25/2006'
 '%m/%d/%y']      # '10/25/06'

另外,如果你在設定中指定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'

6. 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'

7. DecimalField

  • 預設的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:Python decimal物件。
  • 驗證給定的值為一個十進位制數。 忽略前導和尾隨的空白。
  • 錯誤資訊的鍵:max_whole_digitsmax_digitsmax_decimal_places,max_value, invalid, required,min_value

接收四個可選的引數:

max_value,min_value:允許的值的範圍,需要賦值decimal.Decimal物件,不能直接給個整數型別。

max_digits:值允許的最大位數(小數點之前和之後的數字總共的位數,前導的零將被刪除)。

decimal_places:允許的最大小數位。

8. DurationField

  • 預設的Widget:TextInput
  • 空值:None
  • 規範化為:Python timedelta。
  • 驗證給出的值是一個字串,而且可以轉換為timedelta物件。
  • 錯誤資訊的鍵:required, invalid.

9. EmailField

  • 預設的Widget:EmailInput
  • 空值:''(一個空字串)
  • 規範化為:Unicode 物件。
  • 使用正則表示式驗證給出的值是一個合法的郵件地址。
  • 錯誤資訊的鍵:required, invalid

兩個可選的引數用於驗證,max_length 和min_length。

10. FileField

  • 預設的Widget:ClearableFileInput
  • 空值:None
  • 規範化為:一個UploadedFile物件,它封裝檔案內容和檔名到一個物件內。
  • 驗證非空的檔案資料已經繫結到表單。
  • 錯誤資訊的鍵:missing, invalid, required, empty, max_length

具有兩個可選的引數用於驗證:max_length 和 allow_empty_file。

11. FilePathField

  • 預設的Widget:Select
  • 空值:None
  • 規範化為:Unicode 物件。
  • 驗證選擇的選項在選項列表中存在。
  • 錯誤資訊的鍵:required, invalid_choice

這個欄位允許從一個特定的目錄選擇檔案。 它有五個額外的引數,其中的path是必須的:

path:要列出的目錄的絕對路徑。 這個目錄必須存在。

recursive:如果為False(預設值),只用直接位於path下的檔案或目錄作為選項。如果為True,將遞迴訪問這個目錄,其內所有的子目錄和檔案都將作為選項。

match:正則表達模式;只有具有與此表示式匹配的檔名稱才被允許作為選項。

allow_files:可選。預設為True。表示是否應該包含指定位置的檔案。它和allow_folders必須有一個為True。

allow_folders可選。預設為False。表示是否應該包含指定位置的目錄。

12. FloatField

  • 預設的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:Float 物件。
  • 驗證給定的值是一個浮點數。
  • 錯誤資訊的鍵:max_value, invalid, required, min_value

接收兩個可選的引數用於驗證,max_value和min_value,控制允許的值的範圍。

13. ImageField

  • 預設的Widget:ClearableFileInput
  • 空值:None
  • 規範化為:一個UploadedFile 象,它封裝檔案內容和檔名為一個單獨的物件。
  • 驗證檔案資料已繫結到表單,並且該檔案是Pillow可以解析的影象格式。
  • 錯誤資訊的鍵:missing, invalid, required, empty, invalid_image

使用ImageField需要安裝Pillow(pip install pillow)。如果在上傳圖片時遇到影象損壞錯誤,通常意味著使用了Pillow不支援的格式。

14. IntegerField

  • 預設的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
  • 空值:None
  • 規範化為:Python 整數或長整數。
  • 驗證給定值是一個整數。 允許前導和尾隨空格,類似Python的int()函式。
  • 錯誤資訊的鍵:max_value, invalid, required, min_value

兩個可選引數:max_value和min_value,控制允許的值的範圍。

15. GenericIPAddressField

包含IPv4或IPv6地址的欄位。

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:一個Unicode物件。
  • 驗證給定值是有效的IP地址。
  • 錯誤資訊的鍵:required, invalid

有兩個可選引數:protocol和unpack_ipv4

16. MultipleChoiceField

  • 預設的Widget:SelectMultiple
  • 空值:[](一個空列表)
  • 規範化為:一個Unicode 物件列表。
  • 驗證給定值列表中的每個值都存在於選擇列表中。
  • 錯誤資訊的鍵:invalid_list, invalid_choice, required

17. TypedMultipleChoiceField

類似MultipleChoiceField,除了需要兩個額外的引數,coerce和empty_value。

  • 預設的Widget:SelectMultiple
  • 空值:empty_value
  • 規範化為:coerce引數提供的型別值列表。
  • 驗證給定值存在於選項列表中並且可以強制。
  • 錯誤資訊的鍵:required, invalid_choice

18. NullBooleanField

  • 預設的Widget:NullBooleanSelect
  • 空值:None
  • 規範化為:Python None, False 或True 值。
  • 不驗證任何內容(即,它從不引發ValidationError)。

19.RegexField

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定值與某個正則表示式匹配。
  • 錯誤資訊的鍵:required, invalid

需要一個必需的引數:regex,需要匹配的正則表示式。

還可以接收max_length,min_length和strip引數,類似CharField。

20. SlugField

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定的字串只包括字母、數字、下劃線及連字元。
  • 錯誤資訊的鍵:required, invalid

此欄位用於在表單中表示模型的SlugField。

21. 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'

22. URLField

  • 預設的Widget:URLInput
  • 空值:''(一個空字串)
  • 規範化為:一個Unicode 物件。
  • 驗證給定值是個有效的URL。
  • 錯誤資訊的鍵:required, invalid

可選引數:max_length和min_length

23. UUIDField

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:UUID物件。
  • 錯誤資訊的鍵:required, invalid

24. ComboField

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:Unicode 物件。
  • 根據指定為ComboField的引數的每個欄位驗證給定值。
  • 錯誤資訊的鍵:required, invalid

接收一個額外的必選引數:fields,用於驗證欄位值的欄位列表(按提供它們的順序)。

>>> from django.forms import ComboField
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()]) >>> f.clean('[email protected]') '[email protected]' >>> f.clean('[email protected]') Traceback (most recent call last): ... ValidationError: ['Ensure this value has at most 20 characters (it has 28).'] 

25. MultiValueField

  • 預設的Widget:TextInput
  • 空值:''(一個空字串)
  • 規範化為:子類的compress方法返回的型別。
  • 根據指定為MultiValueField的引數的每個欄位驗證給定值。
  • 錯誤資訊的鍵:incomplete, invalid, required

26. SplitDateTimeField

  • 預設的Widget:SplitDateTimeWidget
  • 空值:None
  • 規範化為:Python datetime.datetime 物件。
  • 驗證給定的值是datetime.datetime或以特定日期時間格式格式化的字串。
  • 錯誤資訊的鍵:invalid_date, invalid, required, invalid_time

三、建立自定義欄位

如果內建的Field真的不能滿足你的需求,還可以自定義Field。

只需要建立一個django.forms.Field的子類,並實現clean()和__init__()構造方法。__init__()構造方法需要接收前面提過的那些核心引數,比如widget、required,、label、help_text、initial。

還可以通過覆蓋get_bound_field()方法來自定義訪問欄位的方式。