Django基礎-Form組件模塊

Forms組件模塊

form組件特性html

  • 數據驗證功能
  • 生成HTML代碼

引用form組件模塊

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

==其它數據類型都是直接或間接繼承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, 是否能夠編輯

CharField(Field)

參數 釋義
max_length=None 最大長度
min_length=None 最小長度
strip=True 去除首尾空字符
empty_value='' 空值

IntegerField(Field)

參數 釋義
max_value=None 最大值
min_value=None 最小值

DecimalField(IntegerField)

參數 釋義
max_value=None 最大值
min_value=None 最小值
max_digits=None 最大位數
decimal_places=None 小數點後位數

BaseTemporalField(Field)

參數 釋義
input_formats=None 輸入格式

RegexField(CharField)

參數 釋義
regex 自定製正則表達式

ChoiceField(Field)

參數 釋義
choices=() 默認內容

FilePathField(ChoiceField)

參數 釋義
path 路徑
match=None 匹配
recursive=False 遞歸顯示
allow_files=True 全部文件

SplitDateTimeField(MultiValueField)

參數 釋義
input_date_formats=None 輸入日期格式化
input_time_formats=None 輸入時間格式化

form模塊驗證示例

建立自定義驗證模塊類

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':'格式有問題',
        }
    )

獲取form驗證模塊的數據

說明:【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 驗證錯誤的全部錯誤信息

form模塊生成

HTML表單生成

生成表單標籤數據庫

生成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示例

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
相關文章
相關標籤/搜索