form組件特性html
- 數據驗證功能
- 生成HTML代碼
from django import forms #引入forms模塊 from django.forms import fields
模塊類名稱 | 用途釋義 | 模塊類名稱 | 用途釋義 |
---|---|---|---|
Field | 字段主類 | CharField(Field) | 字符串 |
IntegerField(Field) | 整型 | FloatField(IntegerField) | 浮點數 |
DecimalField(IntegerField) | 小數 | BaseTemporalField(Field) | 時間格式化 |
DateField(BaseTemporalField) | 日期 | TimeField(BaseTemporalField) | 時間 |
DateTimeField(BaseTemporalField) | 帶時間的日期 | DurationField(Field) | 持續時間 |
RegexField(CharField) | 正則表達式 | EmailField(CharField) | 郵箱 |
FileField(Field) | 文件 | ImageField(FileField) | 圖片 |
URLField(CharField) | URL地址 | BooleanField(Field) | 布爾值 |
NullBooleanField(BooleanField) | 能夠爲空的布爾值 | ChoiceField(Field) | 選擇框 |
TypedChoiceField(ChoiceField) | 帶數據轉換選擇框 | MultipleChoiceField(ChoiceField) | 多選框 |
TypedMultipleChoiceField(MultipleChoiceField) | 帶數據轉換多選框 | ComboField(Field) | 多類型組合 |
MultiValueField(Field) | 多個值 | FilePathField(ChoiceField) | 文件路徑 |
SplitDateTimeField(MultiValueField) | 分割日期時間 | GenericIPAddressField(CharField) | IP地址 |
SlugField(CharField) | 爲model記錄生成URL惟一路徑 | UUIDField(CharField) | 數據庫UUID類型驗證 |
==其它數據類型都是直接或間接繼承Field類,其它數據類型會有一些獨有的參數==前端
參數 | 釋義 |
---|---|
required=True, | 是否爲空限制 |
widget=None, | HTML插件[自定義生成文本域,單選多選框等,更改默認數據驗證,添加自定義屬性,好比樣式等] |
label=None, | 生成label標籤 |
label_suffix=None, | label內容後綴 |
initial=None, | 初始值 |
help_text="", | 幫助信息,在標籤旁邊顯示 |
error_messages=None, | 錯誤信息 |
show_hidden_initial=Flase, | 是否在當前插件後加一個隱藏且具備默認值的插件,通常用於驗證兩次輸入是否一致 |
validators=[], | 自定義驗證規則 |
localize=False, | 是否支持本地化 |
disabled=False, | 是否能夠編輯 |
參數 | 釋義 |
---|---|
max_length=None | 最大長度 |
min_length=None | 最小長度 |
strip=True | 去除首尾空字符 |
empty_value='' | 空值 |
參數 | 釋義 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
參數 | 釋義 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
max_digits=None | 最大位數 |
decimal_places=None | 小數點後位數 |
參數 | 釋義 |
---|---|
input_formats=None | 輸入格式 |
參數 | 釋義 |
---|---|
regex | 自定製正則表達式 |
參數 | 釋義 |
---|---|
choices=() | 默認內容 |
參數 | 釋義 |
---|---|
path | 路徑 |
match=None | 匹配 |
recursive=False | 遞歸顯示 |
allow_files=True | 全部文件 |
參數 | 釋義 |
---|---|
input_date_formats=None | 輸入日期格式化 |
input_time_formats=None | 輸入時間格式化 |
from django import forms from django.forms import fields class 自定義form模塊類名稱(forms.Form): #繼承forms模塊 驗證字段名(與數據庫字段名保持一致)=驗證類型(驗證參數)
支持多個正則表達式git
class From_check(forms.Form): #繼承forms模塊 user = fields.CharField( label="用戶", max_length=18, min_length=2, required=True, validators=[RegexValidator(r'^[0-9]{15}'),'15位數的身份證',RegexValidator(r'^[0-9]{17}([0-9]|X)$','18位數的身份證')], error_messages={ 'required':'用戶名不能爲空', 'max_length':'用戶名不能超過18個字符', 'min_length':'用戶名不能小於2個字符', 'invalid':'格式有問題', } )
說明:【data_obj 】爲自定義變量,【From_check】爲自定義驗證模塊類正則表達式
語句 | 釋義 |
---|---|
data_obj = From_check() | 獲取驗證模塊全部信息(包含錯誤信息反饋) |
data_obj = From_check({"user":data.user}) | 獲取驗證模塊user字段的信息(data爲數據庫對象,user爲數據庫字段) |
data_obj = From_check(request.GET) | 獲取 GET 方式提交全部驗證數據 |
data_obj = From_check(request.POST) | 獲取 POST 方式提交全部驗證數據 |
if data_obj.is_valid(): | 判斷是否驗證經過 |
data_obj.cleaned_data | 驗證經過的全部數據 |
data_obj.errors | 驗證錯誤的全部錯誤信息 |
生成表單標籤數據庫
生成HTML用法 | 釋義 |
---|---|
{{ data_obj.as_標籤 }} | 生成所有信息,標籤能夠是table、p、ul等,如{{ data_obj.as_p }} |
{{ data_obj.字段 }} | 生成指定的字段信息,如{{ data_obj.name }} |
表單對應屬性django
表單屬性 | 釋義 |
---|---|
{{ field.label }} | 字段對應的 lable 標籤文字 |
{{ field.label_tag }} | 字段對應的 lable 標籤 |
{{ field.id_for_label }} | 字段 id 屬性 |
{{ field.value }} | 字段值 |
{{ field.html_name }} | 字段 name 屬性的值 |
{{ field.help_text }} | 字段的幫助文本 |
{{ field.errors }} | 字段驗證後的錯誤信息 |
{{ field.is_hidden }} | 判斷字段是否隱藏字段結果爲布爾值 |
{{ field.field }} | 字段對象,能夠經過它訪問字段的屬性,例如「{{ field.field.max_length }}」,「{{ field.field.required}} |
綜合生成HTML用法示例後端
#HTML頁面生成 {{ obj.user }} | 從後端數據調取,利用 forms 模塊生成 user用戶 input標籤 其它標籤類同 {{ data_obj }} | 後端獲取的全部數據 {{ data_obj.user }} | 後端獲取的 user 字段的數據 {{ data_obj.user.cleaned_data }} | 後端獲取的 user 字段驗證經過的數據 {{ data_obj.user.cleaned_errors }} | 後端獲取的 user 字段驗證失敗的錯誤信息反饋,可能有多個錯誤信息 {{ data_obj.user.cleaned_errors.0 }}| 後端獲取的 user 字段驗證失敗的錯誤信息反饋的第一個錯誤信息
widget更改默認樣式示例1【變動默認樣式】函數
from django.forms import fields,widgets gen = fields.ChoiceField( label="性別", choices=((0,'男'),(1,'女'),), initial=0, widget=widgets.RadioSelect, error_messages={ 'required': '性別是必選項' }
widget更改默認樣式示例2【更改默認屬性】ui
from django.forms import fields,widgets xdb = fields.MultipleChoiceField( label="城市", choices=((0,'上海'),(1,'北京'),), initial=0, widget=widgets.SelectMultiple(attrs={'class':'style01'}) error_messages={ 'required': '格式錯誤!' }
根據Forms模塊源碼得知驗證方式,利用Django源碼預留的clean_驗證增長自定義擴展驗證插件
from django.core.exceptions import ValidationError def clean_驗證字段(self): 驗證代碼【可從數據庫調取數據作對比驗證】 raise ValidationError('返回的錯誤信息') return self.cleaned_data['驗證字段']
用戶名是否重複驗證【單字段驗證】
from django import forms from django.forms import fields from django.core.exceptions import ValidationError #引用錯誤反饋模塊 class From_check(forms.Form): #繼承forms模塊 def clean_username(self): #自定義擴展驗證函數 v = self.cleaned_data['username'] #須要驗證的數據 if models.User_Tab.objects.filter(username=v).count(): #從User_Tab中查找對比數據出現次數可知數據庫中是否有此用戶名 raise ValidationError('此用戶名已經被佔用!') return v
用戶名和郵箱是否重複驗證【多字段驗證】
==注意,使用 clean() 函數作數據驗證,拿到的是總體錯誤信息反饋,前端頁面應該使用{{ obj.non_field_errors }} 來調用==
from django import forms from django.forms import fields from django.core.exceptions import ValidationError #引用錯誤反饋模塊 class From_check(forms.Form): #繼承forms模塊 def clean(self): #Django預留擴展驗證函數 value_dict = self.cleaned_data #其餘驗證經過的數據 v1 = value_dict.get('username') #拿到驗證經過的 username 字段數據,用於再次驗證 v2 = value_dict.get('email') #拿到驗證經過的 email 字段數據,用於再次驗證 if models.User_Tab.objects.filter(username=v1).count():#從User_Tab中查找對比數據出現次數可知數據庫中是否有此用戶名 raise ValidationError('此用戶名已經被佔用!') elif models.User_Tab.objects.filter(email=v2).count():#從User_Tab中查找對比數據出現次數可知數據庫中是否有此郵箱 raise ValidationError('此郵箱已經被佔用!') return self.cleaned_data
或
from django import forms from django.forms import fields from django.core.exceptions import ValidationError #引用錯誤反饋模塊 class From_check(forms.Form): #繼承forms模塊 def clean(self): # Django預留擴展驗證函數 value_dict = self.cleaned_data # 其餘驗證經過的數據 v1 = value_dict.get('user') # 拿到驗證經過的 username 字段數據,用於再次驗證 v2 = value_dict.get('email') # 拿到驗證經過的 email 字段數據,用於再次驗證 print("驗證經過的用戶名是:", v1, "郵箱是", v2) d1 = models.User_tab.objects.filter(user=v1).count() # 獲取數據庫中用戶名出現次數 d2 = models.User_tab.objects.filter(email=v2).count() # 獲取數據庫中郵箱出現次數 print("數據庫獲取v1是否存在", d1, "數據庫獲取v2是否存在", d2) if d1 != 0 or d2 != 0: # 判斷用戶名和郵箱在數據庫中是否存在 raise ValidationError('此用戶或郵箱已經被佔用!') return self.cleaned_data