介紹
wtforms是一個支持多個web框架的form組件,主要用來做表單的驗證以及生成的,
安裝
pip install wtforms
使用
自定義一個類,繼承wtforms.Form類,定義字段
from wtforms import Form
from wtforms.fields import simple,core,html5 # 字段來自於這里
from wtforms import validators # 驗證規則來自於這里
from wtforms import widgets # 工具是在這里
class LoginForm(Form):
user = simple.StringField(
label='用戶名', # 提示信息
validators=[validators.DataRequired(message='用戶名不能為空.')], #驗證規則的列表
widget=widgets.TextInput(), # 優先按他定義的方式渲染input標簽
render_kw={'class': 'form-control'} # 為input標簽設置屬性
)
渲染
實例自定義的類對象,傳入模板中,如果實例對象時傳入了數據,該數據會被渲染到input框里
{{ form.name }} # 該字段的input框
{{ form.name.label }} # 該字段提示信息
{{ form.name.errors[0] }} # 該字段的錯誤信息,建議用這種方式,下面那種獲取字段的錯誤信息會拋出異常
{{ form.errors }} # 全部的錯誤信息
# 也可以使用for循環的方式,並且他的順序不會錯亂,因為Form內部維持了一個計數器
{% for item in form %}
<p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
{% endfor %}
驗證
實例自定義類對象是傳遞數據
form = LoginForm(formdata=request.form)
if form.validate():
# 驗證通過,打印數據
print(form.data)
else:
print(form.error) # 打印錯誤信息
實例化時可傳遞的幾種數據
formdata : request.data這種有get和get_list的 data : 一個字典 obj : obj.字段名獲得數據的,比如模型類對象
字段
在wtforms.fields提供了三個包simple,core,html5
simple是簡單常用的包括:
['BooleanField', 'TextAreaField', 'PasswordField', 'FileField',
'HiddenField', 'SubmitField', 'TextField']
core是不太常用的
(
'BooleanField', 'DecimalField', 'DateField', 'DateTimeField', 'FieldList',
'FloatField', 'FormField', 'IntegerField', 'RadioField', 'SelectField',
'SelectMultipleField', 'StringField',
)
html5中的標簽自帶正則(瀏覽器校驗)
(
'DateField', 'DateTimeField', 'DateTimeLocalField', 'DecimalField',
'DecimalRangeField', 'EmailField', 'IntegerField', 'IntegerRangeField',
'SearchField', 'TelField', 'URLField',
)
這里要注意的是core.RadioField(單選),core.SelectField(下拉菜單),core.SelectMultipleField(多選下拉菜單)有一個coerce屬性,指定了數據轉化的類型(因為從前端獲取到的都是字符串),如果沒有轉化成對應的數據類型就會驗證失敗.
另外如果我們想要動態的獲取choices的值,可以通過在自己寫的類中重寫__init__方法.每次實例化的時候去獲去一次,再執行父類中的__init__就可以實時更新選項了
class RegisterForm(Form):
city = core.SelectField(
label='城市',
choices=SQLHelper.fetch_all('select id,name from city',{},None),
coerce=int
)
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
self.city.choices = PymysqlConn.fetch_all('select id,name from city',{},None)
驗證規則
在wtforms.validators中提供了許多的驗證規則
(
'DataRequired', 'data_required', 'Email', 'email', 'EqualTo', 'equal_to',
'IPAddress', 'ip_address', 'InputRequired', 'input_required', 'Length',
'length', 'NumberRange', 'number_range', 'Optional', 'optional',
'Required', 'required', 'Regexp', 'regexp', 'URL', 'url', 'AnyOf',
'any_of', 'NoneOf', 'none_of', 'MacAddress', 'mac_address', 'UUID'
)
下面介紹幾個常用的
DataRequired:非空驗證,message=錯誤信息
Email:郵箱格式驗證,message=錯誤信息
Length: 長度驗證,min=最短,max=最長,message=錯誤信息
Regexp: 正則匹配,regex正則表達式,message=錯誤信息
EqualTo:與其他字段的值比較是否相同,fieldname=其他字段名,message=錯誤信息
自定義驗證-鈎子
# 為一個字段設置驗證
def validate_字段名(self, field):
print(field.data) # 當前字段傳過來的值
print(self.data) # 當前傳過來的所有的值:name,gender.....
if 驗證失敗:
raise validators.ValidationError("繼續后續驗證")
# raise validators.StopValidation("不再繼續后續驗證")
小部件
wtforms.widgets提供了許多的表單樣式,每個字段都有默認的widget,通過設置widget可以修改渲染出來的樣式
('CheckboxInput', 'FileInput', 'HiddenInput', 'ListWidget', 'PasswordInput',
'RadioInput', 'Select', 'SubmitInput', 'TableWidget', 'TextArea',
'TextInput', 'Option')
多選框的設置
favor = core.SelectMultipleField(
label='喜好',
choices=(
(1, '籃球'),
(2, '足球'),
),
widget=widgets.ListWidget(prefix_label=False),
option_widget=widgets.CheckboxInput(),
coerce=int,
default=[1, 2]
)
源碼中的實例化以及驗證

