Python Web框架之Django框架Form組件用法詳解
本文實(shí)例講述了Python Web框架之Django框架Form組件用法。分享給大家供大家參考,具體如下:
Form簡(jiǎn)介
在HTTP中,表單(form標(biāo)簽),是用來(lái)提交數(shù)據(jù)的,其action屬性說(shuō)明了其傳輸數(shù)據(jù)的方法:如何傳、如何接收。
訪(fǎng)問(wèn)網(wǎng)站時(shí),表單可以實(shí)現(xiàn)客戶(hù)端與服務(wù)器之間的通信。例如查詢(xún),就用到了表單(其屬性中,action=get)。
再比如說(shuō)注冊(cè)與登陸,也是要用到表單的。但這里由于涉及到隱私問(wèn)題,需要保證數(shù)據(jù)傳輸?shù)陌踩裕虼似鋫鬏敺椒ň蛻?yīng)當(dāng)使用post而非get。
總之,對(duì)客戶(hù)端來(lái)說(shuō),表單就是用來(lái)向服務(wù)器提交數(shù)據(jù)的;
而對(duì)服務(wù)器來(lái)說(shuō),表單就是你提供給客戶(hù)端的發(fā)送信息的渠道,你需要對(duì)用戶(hù)發(fā)送來(lái)的信息進(jìn)行處理和響應(yīng),以達(dá)到頁(yè)面的交互。
Django Form的功能
- 生成HTML標(biāo)簽
- 驗(yàn)證用戶(hù)數(shù)據(jù)(顯示錯(cuò)誤信息)
- HTML Form提交保留上次提交數(shù)據(jù)
- 初始化頁(yè)面顯示內(nèi)容
Django Form驗(yàn)證流程
用于驗(yàn)證用戶(hù)請(qǐng)求數(shù)據(jù)合法性的一個(gè)組件
如果沒(méi)有Form就得繁瑣地用正則表達(dá)式了
a. 用戶(hù)提交數(shù)據(jù)的驗(yàn)證
1、創(chuàng)建模版 class LoginForm(forms.Form):...
2、將請(qǐng)求交給模版,創(chuàng)建一個(gè)對(duì)象 obj = LoginForm(request.POST)
3、進(jìn)行驗(yàn)證 obj.is_valid()
4、獲取正確信息 obj.clean()
5、獲取錯(cuò)誤信息 obj.errors
b. 錯(cuò)誤信息提示
Form提交,刷新頁(yè)面的特性,模版對(duì)象內(nèi)部值豐富,再顯示時(shí),值和錯(cuò)誤信息都有
c. 保留上一次提交的數(shù)據(jù)
1、自動(dòng)生成html標(biāo)簽
2、保留上一次提交的數(shù)據(jù)
Form的創(chuàng)建
from django.shortcuts import render, redirect
from django import forms
#這里為了簡(jiǎn)單,把form類(lèi)寫(xiě)到視圖函數(shù)
# 模版
class LoginForm(forms.Form):
# 模版中的元素
user = forms.CharField(min_length=6,error_messages={"required": '用戶(hù)名不能為空','min_length': '用戶(hù)名長(zhǎng)度不能小6'})
email = forms.EmailField(error_messages={"required": '郵箱不能為空','invalid': '郵箱格式錯(cuò)誤'})
def login(request):
if request.method == "GET":
# 數(shù)據(jù)庫(kù)中獲取
obj = LoginForm()
return render(request,'login.html',{'oo': obj})
elif request.method == "POST":
"""
obj = LoginForm(request.POST)
# 驗(yàn)證
status = obj.is_valid()
print(status)
value_dict = obj.clean() 驗(yàn)證成功的值,輸入格式正確的拿到了
print(value_dict)
# error_obj = obj.errors
error_obj = obj.errors.as_json()
print(error_obj) code定義錯(cuò)誤信息
"""
obj = LoginForm(request.POST)
if obj.is_valid():
value_dict = obj.clean()
print(value_dict)
# create(**value_dict)
else:
# 封裝了所有的錯(cuò)誤信息
# error_obj=obj.errors
# print(obj.errors['email'][0],type(error_obj['email'])
# print(obj.errors['email'][0],type(error_obj['email'][0])
# print(obj.errors["user"][0])
# print(type(error_obj))
from django.forms.utils import ErrorDict
pass
return render(request, 'login.html',{'oo': obj})
當(dāng)然你也可以在app里創(chuàng)建form.py文件,在里面創(chuàng)建類(lèi):
下文將使用這個(gè)文件。
from django import forms as DForms
from django.forms import fields
from django.forms import widgets
from django.core.validators import RegexValidator
class DetailForm(DForms.Form):
user1 = fields.CharField() #默認(rèn)input框,可以改成select,radio等
user2 = fields.CharField(widget=widgets.TextInput)
user4 = fields.IntegerField()
# 字符串
user3 = fields.ChoiceField(choices=[(1, 'SH'), (2, 'BJ'), ])
user5 = fields.CharField(
widget=widgets.Select(choices=[(1, 'SH'), (2, 'BJ'), ])
)
user6 = fields.IntegerField(
widget=widgets.Select(choices=[(1, 'SH'), (2, 'BJ'), ])
)
user7 = fields.IntegerField(
widget=widgets.RadioSelect(choices=[(1, 'SH'), (2, 'BJ'), ])
)
#{'user1': '11', 'user2': '22', 'user4': 33, 'user3': '1', 'user5': '2', 'user6': 1, 'user7': 2}
視圖函數(shù):
from django.shortcuts import render, redirect
from app01 import forms
def detail(request):
obj = forms.DetailForm(request.POST)
obj.is_valid()
print(obj.clean())
return render(request,'detail.html', {'obj': obj})
生成HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/detail.html" method="POST">
{{ obj.user1 }}
{{ obj.user2 }}
{{ obj.user3 }}
{{ obj.user4 }}
{{ obj.user5 }}
{{ obj.user6 }}
{{ obj.user7 }}
<input type="submit" value="提交"/>
</form>
</body>
</html>
常用HTML標(biāo)簽:
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.xxoo.label }}
{{ form.xxoo.id_for_label }}
{{ form.xxoo.label_tag }}
{{ form.xxoo.errors }}
<p>{{ form.user }} {{ form.user.errors }}</p>
<input type="submit" />
</form>
運(yùn)行后后臺(tái)返回結(jié)果:
#{'user1': '11', 'user2': '22', 'user4': 33, 'user3': '1', 'user5': '2', 'user6': 1, 'user7': 2}
下面將講解為什么是這個(gè)結(jié)果
Django的Form的實(shí)現(xiàn)步驟:
a. 創(chuàng)建一個(gè)驗(yàn)證用戶(hù)請(qǐng)求的模板包含:
類(lèi):模版,到底驗(yàn)證幾個(gè)
字段:用于驗(yàn)證用戶(hù)某個(gè)字段
插件:user = forms.CharField(..,widget=Input框)
Django內(nèi)置字段如下:
1,字段核心參數(shù)
每個(gè)字段類(lèi)的構(gòu)造函數(shù)至少接受這些參數(shù)。有些字段類(lèi)接受額外的、字段特有的參數(shù),但以下參數(shù)應(yīng)該總是能接受:
Field.required
默認(rèn)情況下,每個(gè)字段 類(lèi)都假設(shè)必需有值,所以如果你傳遞一個(gè)空的值 —— 不管是None 還是空字符串(“”) —— clean() 將引發(fā)一個(gè)ValidationError 異常。
Field.label
正如在前面“輸出表單為HTML”中解釋的,字段默認(rèn)label 是通過(guò)將字段名中所有的下劃線(xiàn)轉(zhuǎn)換成空格并大寫(xiě)第一個(gè)字母生成的。如果默認(rèn)的標(biāo)簽不合適,可以指定label。
Field.label_suffix
label_suffix 參數(shù)讓你基于每個(gè)字段覆蓋表單的label_suffix。
Field.initial
initial 參數(shù)讓你指定渲染未綁定的表單中的字段時(shí)使用的初始值。
Field.widget
widget 參數(shù)讓你指定渲染表單時(shí)使用的Widget 類(lèi)。更多信息參見(jiàn)Widgets。
Field.help_text
help_text 參數(shù)讓你指定字段的描述文本。如果提供help_text,在通過(guò)表單的便捷方法(例如,as_ul())渲染字段時(shí),它將緊接著字段顯示。
Field.error_messages
error_messages 參數(shù)讓你覆蓋字段引發(fā)的異常中的默認(rèn)信息。傳遞的是一個(gè)字典,其鍵為你想覆蓋的錯(cuò)誤信息。
Field.validators
validators 參數(shù)讓你可以為字段提供一個(gè)驗(yàn)證函數(shù)的列表。
Field.localize
localize 參數(shù)啟用表單數(shù)據(jù)的本地化,包括輸入和輸出。
Field.has_changed()
has_changed() 方法用于決定字段的值是否從初始值發(fā)生了改變。返回True 或False。
2,內(nèi)建字段
Field
required=True, 是否允許為空
widget=None, HTML插件
label=None, 用于生成Label標(biāo)簽或顯示內(nèi)容
initial=None, 初始值
help_text='', 幫助信息(在標(biāo)簽旁邊顯示)
error_messages=None, 錯(cuò)誤信息 {'required': '不能為空', 'invalid': '格式錯(cuò)誤'}
show_hidden_initial=False, 是否在當(dāng)前插件后面再加一個(gè)隱藏的且具有默認(rèn)值的插件(可用于檢驗(yàn)兩次輸入是否一直)
validators=[], 自定義驗(yàn)證規(guī)則
localize=False, 是否支持本地化
disabled=False, 是否可以編輯
label_suffix=None Label內(nèi)容后綴
CharField(Field)
max_length=None, 最大長(zhǎng)度
min_length=None, 最小長(zhǎng)度
strip=True 是否移除用戶(hù)輸入空白
- 默認(rèn)的Widget:TextInput
- 空值:' ‘(一個(gè)空字符串)
- 規(guī)范化為:一個(gè)Unicode 對(duì)象。
- 如果提供,驗(yàn)證max_length 或min_length。 否則,所有的輸入都是合法的。
- 錯(cuò)誤信息的鍵:required, max_length, min_length
可選參數(shù):max_length, min_length
IntegerField(Field)
max_value=None, 最大值
min_value=None, 最小值
FloatField(IntegerField)
- 默認(rèn)的Widget:當(dāng) Field.localize 是False 時(shí)為NumberInput,否則為T(mén)extInput。
- 空值:None
- 規(guī)范化為:一個(gè)Float 對(duì)象。
- 驗(yàn)證給出的值是一個(gè)浮點(diǎn)數(shù)。和Python 的float() 函數(shù)一樣,允許前導(dǎo)和尾隨的空白符。
- 錯(cuò)誤信息的鍵:required, invalid, max_value, min_value
DecimalField(IntegerField)
max_value=None, 最大值
min_value=None, 最小值
max_digits=None, 總長(zhǎng)度
decimal_places=None, 小數(shù)位長(zhǎng)度
BaseTemporalField(Field)
input_formats=None 時(shí)間格式化
DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
DurationField(Field) 時(shí)間間隔:%d %H:%M:%S.%f
- 默認(rèn)的Widget:TextInput
- 空值:None
- 規(guī)范化為:一個(gè)Python timedelta。
- 驗(yàn)證給出的值是一個(gè)字符串,而可以給轉(zhuǎn)換為timedelta。
- 錯(cuò)誤信息的鍵:required, invalid.
RegexField(CharField)
regex, 自定制正則表達(dá)式
max_length=None, 最大長(zhǎng)度
min_length=None, 最小長(zhǎng)度
error_message=None, 忽略,錯(cuò)誤信息使用 error_messages={'invalid': '...'}
EmailField(CharField)
- 默認(rèn)的Widget:EmailInput
- 空值:”(一個(gè)空字符串)
- 規(guī)范化為:一個(gè)Unicode 對(duì)象。
- 驗(yàn)證給出的值是一個(gè)合法的郵件地址,使用一個(gè)適度復(fù)雜的正則表達(dá)式。
- 錯(cuò)誤信息的鍵:required, invalid
FileField(Field)
allow_empty_file=False 是否允許空文件
ImageField(FileField)
...
注:需要PIL模塊,pip3 install Pillow
以上兩個(gè)字典使用時(shí),需要注意兩點(diǎn):
- form表單中 enctype="multipart/form-data"
- view函數(shù)中 obj = MyForm(request.POST, request.FILES)
URLField(Field)
- 默認(rèn)的Widget:URLInput
- 空值:”(一個(gè)空字符串)
- 規(guī)范化為:一個(gè)Unicode 對(duì)象。
- 驗(yàn)證給定值是有效的URL。
- 錯(cuò)誤信息的鍵:required, invalid
BooleanField(Field)
- 默認(rèn)的Widget:CheckboxInput
- 空值:False
- 規(guī)范化為:Python 的True 或 False。
- 如果字段帶有required=True,驗(yàn)證值是否為T(mén)rue(例如復(fù)選框被勾上)。
- 錯(cuò)誤信息的鍵:required
NullBooleanField(BooleanField)
- 默認(rèn)的Widget:NullBooleanSelect
- 空值:None
- 規(guī)范化為:一個(gè)Python True, False 或None 值。
- 不驗(yàn)證任何內(nèi)容(即,它從不引發(fā)ValidationError)。
ChoiceField(Field)
...
choices=(), 選項(xiàng),如:choices = ((0,'上海'),(1,'北京'),)
required=True, 是否必填
widget=None, 插件,默認(rèn)select插件
label=None, Label內(nèi)容
initial=None, 初始值
help_text='', 幫助提示
- 默認(rèn)的Widget:Select
- 空值:”(一個(gè)空字符串)
- 規(guī)范化為:一個(gè)Unicode 對(duì)象。
- 驗(yàn)證給定的值在選項(xiàng)列表中存在。
- 錯(cuò)誤信息的鍵:required, invalid_choice
ModelChoiceField(ChoiceField)
... django.forms.models.ModelChoiceField
queryset, # 查詢(xún)數(shù)據(jù)庫(kù)中的數(shù)據(jù)
empty_label="---------", # 默認(rèn)空顯示內(nèi)容
to_field_name=None, # HTML中value的值對(duì)應(yīng)的字段
limit_choices_to=None # ModelForm中對(duì)queryset二次篩選
ModelMultipleChoiceField(ModelChoiceField)
... django.forms.models.ModelMultipleChoiceField
MultipleChoiceField(**kwargs)
- 默認(rèn)的Widget:SelectMultiple
- 空值:[](一個(gè)空列表)
- 規(guī)范化為:一個(gè)Unicode 對(duì)象列表。
- 驗(yàn)證給定值列表中的每個(gè)值都存在于選擇列表中。
- 錯(cuò)誤信息的鍵:required, invalid_choice, invalid_list
TypedMultipleChoiceField(**kwargs)
就像MultipleChoiceField,除了TypedMultipleChoiceField需要兩個(gè)額外的參數(shù),coerce和empty_value。
- 默認(rèn)的Widget:SelectMultiple
- 空值:empty_value
- 規(guī)范化為:coerce參數(shù)提供的類(lèi)型值列表。
- 驗(yàn)證給定值存在于選項(xiàng)列表中并且可以強(qiáng)制。
- 錯(cuò)誤信息的鍵:required, invalid_choice
TypedChoiceField(ChoiceField)
coerce = lambda val: val 對(duì)選中的值進(jìn)行一次轉(zhuǎn)換
empty_value= '' 空值的默認(rèn)值
- 默認(rèn)的Widget:Select
- 空值:empty_value
- 規(guī)范化為:coerce 參數(shù)類(lèi)型的值。
- 驗(yàn)證給定的值在選項(xiàng)列表中存在并且可以被強(qiáng)制轉(zhuǎn)換。
- 錯(cuò)誤信息的鍵:required, invalid_choice
ImageField(**kwargs)
- 默認(rèn)的Widget:ClearableFileInput
- 空值:None
- 規(guī)范化為: An UploadedFile object that wraps the file content and file name into a single object.
- 驗(yàn)證文件數(shù)據(jù)已綁定到表單,并且該文件具有Pillow理解的圖像格式。
- 錯(cuò)誤信息的鍵:required, invalid, missing, empty, invalid_image
TypedMultipleChoiceField(MultipleChoiceField)
coerce = lambda val: val 對(duì)選中的每一個(gè)值進(jìn)行一次轉(zhuǎn)換
empty_value= '' 空值的默認(rèn)值
ComboField(Field)
fields=() 使用多個(gè)驗(yàn)證,如下:即驗(yàn)證最大長(zhǎng)度20,又驗(yàn)證郵箱格式
fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
MultiValueField(Field)
PS: 抽象類(lèi),子類(lèi)中可以實(shí)現(xiàn)聚合多個(gè)字典去匹配一個(gè)值,要配合MultiWidget使用
SplitDateTimeField(MultiValueField)
input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
FilePathField(ChoiceField) 文件選項(xiàng),目錄下文件顯示在頁(yè)面中
path, 文件夾路徑
match=None, 正則匹配
recursive=False, 遞歸下面的文件夾
allow_files=True, 允許文件
allow_folders=False, 允許文件夾
required=True,
widget=None,
label=None,
initial=None,
help_text=''
- path,你想要列出的目錄的絕對(duì)路徑。這個(gè)目錄必須存在。
- recursive,如果為False(默認(rèn)值),只用直接位于path 下的文件或目錄作為選項(xiàng)。如果為T(mén)rue,將遞歸訪(fǎng)問(wèn)這個(gè)目錄,其所有的子目錄和文件都將作為選項(xiàng)。
- match,正則表達(dá)式表示的一個(gè)模式;只有匹配這個(gè)表達(dá)式的名稱(chēng)才允許作為選項(xiàng)。
- allow_files,可選。為T(mén)rue 或False。默認(rèn)為T(mén)rue。表示是否應(yīng)該包含指定位置的文件。它和allow_folders 必須有一個(gè)為T(mén)rue。
- allow_folders,可選。為T(mén)rue 或False。 默認(rèn)為False。表示是否應(yīng)該包含指定位置的目錄。 它和allow_files 必須有一個(gè)為T(mén)rue。
FileField(**kwargs)
- 默認(rèn)的Widget:ClearableFileInput
- 空值:None
- 規(guī)范化為:一個(gè)UploadedFile 對(duì)象,它封裝文件內(nèi)容和文件名為一個(gè)單獨(dú)的對(duì)象。
- 可以驗(yàn)證非空的文件數(shù)據(jù)已經(jīng)綁定到表單。
- 錯(cuò)誤信息的鍵:required, invalid, missing, empty, max_length
GenericIPAddressField
protocol='both', both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1時(shí)候,可解析為192.0.2.1, PS:protocol必須為both才能啟用
SlugField(CharField) 數(shù)字,字母,下劃線(xiàn),減號(hào)(連字符)
...
UUIDField(CharField) uuid類(lèi)型
- 默認(rèn)的Widget:TextInput
- 空值:”(一個(gè)空字符串)
- 規(guī)范化為:一個(gè)UUID 對(duì)象。
- 錯(cuò)誤信息的鍵:required, invalid
3.處理關(guān)系字段
兩個(gè)字段可用于表示模型之間的關(guān)系:ModelChoiceField和ModelMultipleChoiceField。這兩個(gè)字段都需要單個(gè)queryset參數(shù),用于創(chuàng)建字段的選擇。在表單驗(yàn)證時(shí),這些字段將把一個(gè)模型對(duì)象(在ModelChoiceField的情況下)或多個(gè)模型對(duì)象(在ModelMultipleChoiceField的情況下)放置到cleaned_data表單的字典。
對(duì)于更復(fù)雜的用法,可以在聲明表單字段時(shí)指定queryset=None,然后在窗體的init()方法中填充queryset:
ModelChoiceField(**kwargs)
- 默認(rèn)的Widget:Select
- 空值:None
- 規(guī)范化為:一個(gè)模型實(shí)例。
- 驗(yàn)證給定的id存在于查詢(xún)集中。
- 錯(cuò)誤信息的鍵:required, invalid_choice
ModelMultipleChoiceField(**kwargs)
- 默認(rèn)的Widget:SelectMultiple
- 空值:QuerySet (self.queryset.none())
- 規(guī)范化為: 模型實(shí)例的一個(gè)QuerySet。
- 驗(yàn)證在給定的值列表中的每個(gè)id存在于查詢(xún)集中。
- 錯(cuò)誤信息的鍵:required, list, invalid_choice, invalid_pk_value
Django內(nèi)置插件:
TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget
# 單radio,值為字符串 # user = fields.CharField( # initial=2, # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),)) # ) # 單radio,值為字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.RadioSelect # ) # 單select,值為字符串 # user = fields.CharField( # initial=2, # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) # ) # 單select,值為字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.Select # ) # 多選select,值為列表 # user = fields.MultipleChoiceField( # choices=((1,'上海'),(2,'北京'),), # initial=[1,], # widget=widgets.SelectMultiple # ) # 單checkbox # user = fields.CharField( # widget=widgets.CheckboxInput() # ) # 多選checkbox,值為列表 # user = fields.MultipleChoiceField( # initial=[2, ], # choices=((1, '上海'), (2, '北京'),), # widget=widgets.CheckboxSelectMultiple # )
在使用選擇標(biāo)簽時(shí),需要注意choices的選項(xiàng)可以從數(shù)據(jù)庫(kù)中獲取,但是由于是靜態(tài)字段 ***獲取的值無(wú)法實(shí)時(shí)更新***,那么需要自定義構(gòu)造方法從而達(dá)到此目的。
如果內(nèi)建的字段不能滿(mǎn)足你的需求,你可以很容易地創(chuàng)建自定義的字段。你需要?jiǎng)?chuàng)建django.forms.Field 的一個(gè)子類(lèi)。它只要求實(shí)現(xiàn)一個(gè)clean() 方法和接收上面核心參數(shù)的init() 方法(required, label, initial, widget, help_text)。
#方法一:
from app01 import models
class DBForm(DForms.Form):
host = fields.CharField()
host_type = fields.IntegerField(
widget=widgets.Select(choices=[])
)
def __init__(self,*args, **kwargs):
# 執(zhí)行父類(lèi)的構(gòu)造方法
super(DBForm,self).__init__(*args, **kwargs)
self.fields['host_type'].widget.choices = models.UserType.objects.all().values_list('id','caption')
#方法二:使用django提供的ModelChoiceField和ModelMultipleChoiceField字段來(lái)實(shí)現(xiàn)
from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms import models as form_model
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
class FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
自定義Form驗(yàn)證規(guī)則:
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
#方法一
class MyForm(Form):
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', '請(qǐng)輸入數(shù)字'), RegexValidator(r'^159[0-9]+$', '數(shù)字必須以159開(kāi)頭')],
)
# 方法二
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手機(jī)號(hào)碼格式錯(cuò)誤')
phone = fields.CharField(validators=[mobile_validate, ],
error_messages={'required': '手機(jī)不能為空'},
widget=widgets.TextInput(attrs={'class': "form-control",
'placeholder': u'手機(jī)號(hào)碼'}))
#方法三
from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
class FInfo(forms.Form):
username = fields.CharField(max_length=5,
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
email = fields.EmailField()
def clean_username(self):
"""
Form中字段中定義的格式匹配完之后,執(zhí)行此方法進(jìn)行驗(yàn)證
:return:
"""
value = self.cleaned_data['username']
if "666" in value:
raise ValidationError('666已經(jīng)被玩爛了...', 'invalid')
return value
同時(shí)生成多個(gè)標(biāo)簽驗(yàn)證:
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
############## 自定義字段 ##############
class PhoneField(fields.MultiValueField):
def __init__(self, *args, **kwargs):
# Define one message for all fields.
error_messages = {
'incomplete': 'Enter a country calling code and a phone number.',
}
# Or define a different message for each field.
f = (
fields.CharField(
error_messages={'incomplete': 'Enter a country calling code.'},
validators=[
RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
],
),
fields.CharField(
error_messages={'incomplete': 'Enter a phone number.'},
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
),
fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
required=False,
),
)
super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
**kwargs)
def compress(self, data_list):
"""
當(dāng)用戶(hù)驗(yàn)證都通過(guò)后,該值返回給用戶(hù)
:param data_list:
:return:
"""
return data_list
希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Sphinx環(huán)境配置及VScode編寫(xiě)Rst文檔轉(zhuǎn)html的步驟
sphinx主要用于編寫(xiě) reStructuredText 和 Markdown 格式技術(shù)文檔,編寫(xiě)此類(lèi)技術(shù)文檔時(shí)Sphinx工具可將其轉(zhuǎn)為html、pdf、ePub等格式,這篇文章主要介紹了Sphinx環(huán)境配置及VScode編寫(xiě)Rst文檔轉(zhuǎn)html,需要的朋友可以參考下2023-03-03
Python 40行代碼實(shí)現(xiàn)人臉識(shí)別功能
很多人都認(rèn)為人臉識(shí)別是一項(xiàng)非常難以實(shí)現(xiàn)的工作,看到名字就害怕,然后心懷忐忑到網(wǎng)上一搜,看到網(wǎng)上N頁(yè)的教程立馬就放棄了。其實(shí)如果你不是非要深究其中的原理,只是要實(shí)現(xiàn)這一工作的話(huà),人臉識(shí)別也沒(méi)那么難。今天我們就來(lái)看看如何在40行代碼以?xún)?nèi)簡(jiǎn)單地實(shí)現(xiàn)人臉識(shí)別。2017-04-04
Python+OpenCV人臉識(shí)別簽到考勤系統(tǒng)實(shí)現(xiàn)(附demo)
本文主要介紹了Python+OpenCV人臉識(shí)別簽到考勤系統(tǒng)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Flask SocketIO實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解
Flask-SocketIO 是基于 Flask 的一個(gè)擴(kuò)展,用于簡(jiǎn)化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實(shí)現(xiàn)動(dòng)態(tài)繪圖,需要的可以參考下2023-11-11
python制作websocket服務(wù)器實(shí)例分享
websocket是一個(gè)瀏覽器和服務(wù)器通信的新的協(xié)議,websocket則和一般的socket一樣,使得瀏覽器和服務(wù)器建立了一個(gè)雙工的通道。今天我們就來(lái)詳細(xì)探討下使用Python實(shí)現(xiàn)websocket服務(wù)器的具體方法2016-11-11
Python字典dict常用方法函數(shù)實(shí)例
這篇文章主要介紹了Python字典dict常用方法函數(shù)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子
今天小編就為大家分享一篇Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

