Form表單的功能html
普通字段詳解:git
class BooleanField(**kwargs):
默認的Widget:CheckboxInput
空值:False
規範化爲:Python 的True 或 False。
若是字段帶有required=True,驗證值是否爲True(例如複選框被勾上)。
錯誤信息的鍵:required
class CharField(**kwargs):
默認的Widget:TextInput
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
若是提供,驗證max_length 或min_length。 不然,全部的輸入都是合法的。
錯誤信息的鍵:required, max_length, min_length
有兩個參數用於驗證:
max_length
min_length
若是提供,這兩個參數將確保字符串的最大和最小長度。
class ChoiceField(**kwargs)¶
默認的Widget:Select
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
驗證給定的值在選項列表中存在。
錯誤信息的鍵:required, invalid_choice
invalid_choice 錯誤消息可能包含%(value)s,它將被選擇的選項替換掉。
接收一個額外的必選參數:choices
用來做爲該字段選項的一個二元組組成的可迭代對象(例如,列表或元組)或者一個可調用對象。
例如:
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
)
class DateField(**kwargs):
默認的Widget:DateInput
空值:None
規範化爲:一個Python datetime.date 對象。
驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:
input_formats
一個格式的列表,用於轉換一個字符串爲datetime.date 對象。
class EmailField(**kwargs)
默認的Widget:EmailInput
空值:''(一個空字符串)
規範化爲:一個Unicode 對象。
驗證給出的值是一個合法的郵件地址,使用一個適度複雜的正則表達式。
錯誤信息的鍵:required, invalid
具備兩個可選的參數用於驗證,max_length 和min_length。若是提供,這兩個參數確保字符串的最大和最小長度。
class FileField(**kwargs)¶
默認的Widget:ClearableFileInput
空值:None
規範化爲:一個UploadedFile 對象,它封裝文件內容和文件名爲一個單獨的對象。
能夠驗證非空的文件數據已經綁定到表單。
錯誤信息的鍵:required, invalid, missing, empty, max_length
具備兩個可選的參數用於驗證,max_length 和 allow_empty_file。若是提供,這兩個參數確保文件名的最大長度,並且即便文件內容爲空時驗證也會成功。
class ImageField(**kwargs)¶
默認的Widget:ClearableFileInput
空值:None
規範化爲: An UploadedFile object that wraps the file content and file name into a single object.
驗證文件數據已綁定到表單,而且該文件具備Pillow理解的圖像格式。
錯誤信息的鍵:required, invalid, missing, empty, invalid_image
使用ImageField須要安裝Pillow並支持您使用的圖像格式。若是在上傳圖片時遇到損壞 圖像錯誤,一般意味着Pillow不瞭解其格式。要解決這個問題,請安裝相應的庫並從新安裝Pillow。
class MultipleChoiceField(**kwargs)¶
默認的Widget:SelectMultiple
空值:[](一個空列表)
規範化爲:一個Unicode 對象列表。
驗證給定值列表中的每一個值都存在於選擇列表中。
錯誤信息的鍵:required, invalid_choice, invalid_list
invalid_choice錯誤消息可能包含%(value)s,將替換爲所選擇的選項。
對於ChoiceField,須要一個額外的必需參數choices。
處理關係的字段:正則表達式
兩個字段可用於表示模型之間的關係:ModelChoiceField和ModelMultipleChoiceField。這兩個字段都須要單個queryset參數,用於建立字段的選擇。數據庫
class ModelChoiceField(**kwargs)¶ 默認的Widget:Select 空值:None 規範化爲:一個模型實例。 驗證給定的id存在於查詢集中。 錯誤信息的鍵:required, invalid_choice 能夠選擇一個單獨的模型對像,適用於表示一個外鍵字段。 ModelChoiceField默認widet不適用選擇數量很大的狀況,在大於100項時應該避免使用它。 須要單個參數: queryset 將導出字段選擇的模型對象的QuerySet,將用於驗證用戶的選擇。 ModelChoiceField也有兩個可選參數: empty_label 默認狀況下,ModelChoiceField使用的<select>小部件將在列表頂部有一個空選項。您可使用empty_label屬性更改此標籤的文本(默認爲"---------"),也能夠禁用空白標籤徹底經過將empty_label設置爲None: to_field_name 此可選參數用於指定要用做字段窗口小部件中選項的值的字段。確保它是模型的惟一字段,不然選定的值能夠匹配多個對象。默認狀況下,它設置爲None,在這種狀況下,將使用每一個對象的主鍵。 例如: field1 = forms.ModelChoiceField(queryset=...) <select id="id_field1" name="field1"> <option value="obj1.pk">Object1</option> <option value="obj2.pk">Object2</option> ... </select>
class ModelMultipleChoiceField(**kwargs)
默認的Widget:SelectMultiple
空值:QuerySet (self.queryset.none())
規範化爲: 模型實例的一個QuerySet。
驗證在給定的值列表中的每一個id存在於查詢集中。
錯誤信息的鍵:required, list, invalid_choice, invalid_pk_value
invalid_choice消息能夠包含%(value)s而且invalid_pk_value消息能夠包含%(pk)s其將被適當的值代替。
容許選擇適合於表示多對多關係的一個或多個模型對象。與ModelChoiceField同樣,您可使用label_from_instance自定義對象表示,queryset是必需的參數:
queryset
將導出字段選擇的模型對象的QuerySet,將用於驗證用戶的選擇。
表單裏choice用的數據庫裏數據時不會實時更新。因此須要將choice放到init裏,每次使用都執行一遍:django
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
self.fields['foo_select'].queryset = ...
字段的核心參數:session
requiredapp
f = forms.CharField(required=False)
默認爲True。ide
>>> from django import forms >>> class CommentForm(forms.Form): ... name = forms.CharField(label='Your name') ... url = forms.URLField(label='Your Web site', required=False) ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> <tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
error_messages:ui
error_messages 參數讓你覆蓋字段引起的異常中的默認信息。傳遞的是一個字典,其鍵爲你想覆蓋的錯誤信息url
has_changed():方法用於決定字段的值是否從初始值發生了改變。返回True 或False
字段數據:
無論表單提交的是什麼數據,一旦經過調用is_valid() 成功驗證(is_valid() 返回True),驗證後的表單數據將位於form.cleaned_data 字典中。
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')
重寫驗證方法:
# 自定義方法(局部鉤子),密碼必須包含字母和數字
def clean_password(self):
if self.cleaned_data.get('password').isdigit() or self.cleaned_data.get('password').isalpha():
raise ValidationError('密碼必須包含數字和字母')
else:
return self.cleaned_data['password']
def clean_valid_code(self): # 檢驗驗證碼正確;以前生成的驗證碼保存在了了session中
if self.cleaned_data.get('valid_code').upper() == self.request.session.get('valid_code'):
return self.cleaned_data['valid_code']
else:
raise ValidationError('驗證碼不正確')
# 自定義方法(全局鉤子, 檢驗兩個字段),檢驗兩次密碼一致;
def clean(self):
if self.cleaned_data.get('password') != self.cleaned_data.get('password2'):
raise ValidationError('密碼不一致')
else:
return self.cleaned_data
# 注意,上面的字典取值用get, 由於假如在clean_password中判斷失敗,那麼沒有返回值,最下面的clean方法直接取值就會失敗s
使用表單模:
手工渲染字段:{{ form.name_of_field }
{{ form.non_field_errors }} <div class="fieldWrapper"> {{ form.subject.errors }} <label for="{{ form.subject.id_for_label }}">Email subject:</label> {{ form.subject }} </div> <div class="fieldWrapper"> {{ form.message.errors }} <label for="{{ form.message.id_for_label }}">Your message:</label> {{ form.message }} </div> <div class="fieldWrapper"> {{ form.sender.errors }} <label for="{{ form.sender.id_for_label }}">Your email address:</label> {{ form.sender }} </div> <div class="fieldWrapper"> {{ form.cc_myself.errors }} <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label> {{ form.cc_myself }} </div>
迭表明單的字段:{{ field }} 包含全部有用的屬性
{% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
可重用的表單模板:
在表單保存到單獨的模塊,用includ標籤來重用
{% include "form_snippet.html" %} # In form_snippet.html: {% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
widgets窗口小部件
widgets.attr 設置標籤屬性
class CommentForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'})) url = forms.URLField() comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'})) >>> f = CommentForm(auto_id=False) >>> f.as_table() <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr> <tr><th>Url:</th><td><input type="url" name="url"/></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr
生成form field對象,指定類型
from django.form impor widgets,fields
xxxx = fields.CharField(widget=widgets.Textarea)