Flask-wtforms相似django中的form組件

一.安裝

pip3 install wtformshtml

二.簡單使用

1.建立flask對象

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder='templates')

app.debug = True

二.生成form組件

class LoginForm(Form):
    # 字段(內部包含正則表達式)
    name = simple.StringField(
        label='用戶名',  #form表單的標籤
        validators=[   #過濾的一些條件
            validators.DataRequired(message='用戶名不能爲空.'),
            validators.Length(min=6, max=18, message='用戶名長度必須大於%(min)d且小於%(max)d')
        ],
        widget=widgets.TextInput(), # 頁面上顯示的插件
        render_kw={'class': 'form-control'}  #form表單頁面中顯示的類名

三.路由

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        form = LoginForm() #生成form對象
        return render_template('login.html', form=form)  #form對象渲染
    else:
        form = LoginForm(formdata=request.form) 
        if form.validate():   #進行form校驗
            print('用戶提交數據經過格式驗證,提交的值爲:', form.data)
        else:
            print(form.errors)
        return render_template('login.html', form=form)

if __name__ == '__main__':
    app.run()

四.頁面渲染

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登陸</h1>
<form method="post">
    <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>

    <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
    <input type="submit" value="提交">
</form>
</body>
</html>

三.相關屬性

1.field字段

WTForms支持HTML字段:html5

字段類型 說明
StringField 文本字段, 至關於type類型爲text的input標籤
TextAreaField 多行文本字段
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段, 值爲datetime.date格式
DateTimeField 文本字段, 值爲datetime.datetime格式
IntegerField 文本字段, 值爲整數
DecimalField 文本字段, 值爲decimal.Decimal
FloatField 文本字段, 值爲浮點數
BooleanField 複選框, 值爲True 和 False
RadioField 一組單選框
SelectField 下拉列表
SelectMultipleField 下拉列表, 可選擇多個值
FileField 文件上傳字段
SubmitField 表單提交按鈕
FormFiled 把表單做爲字段嵌入另外一個表單
FieldList 子組指定類型的字段

2.Validators驗證器

WTForms能夠支持不少表單的驗證函數:python

驗證函數 說明
Email 驗證是電子郵件地址
EqualTo 比較兩個字段的值; 經常使用於要求輸入兩次密鑰進行確認的狀況
IPAddress 驗證IPv4網絡地址
Length 驗證輸入字符串的長度
NumberRange 驗證輸入的值在數字範圍內
Optional 無輸入值時跳過其它驗證函數
DataRequired 確保字段中有數據
Regexp 使用正則表達式驗證輸入值
URL 驗證url
AnyOf 確保輸入值在可選值列表中
NoneOf 確保輸入值不在可選列表中

3.字段參數

參數名 介紹
label 字段別名,在頁面中能夠經過字段.label展現
validators 驗證規則列表
filters 過氯器列表,用於對提交數據進行過濾
description 描述信息,一般用於生成幫助信息
id 表示在form類定義時候字段的位置,一般你不須要定義它,默認會按照定義的前後順序排序。
default 默認值
widget html插件,經過該插件能夠覆蓋默認的插件,更多經過用戶自定義
render_kw 自定義html屬性
choices 複選類型的選項

4.局部鉤子

#在form類中
def validate_字段名(self, field):
        #self.data 得到全局字段的一個相似字典的格式
        #self.data['字段'],能夠得到全局中任意字段
        #field.data 當前字段的值
        #無需返回值,若是有不知足的狀況須要拋錯
        #如兩個密碼,有兩種狀況
        # raise validators.ValidationError("密碼不一致") # 繼續後續驗證
        #  raise validators.StopValidation("密碼不一致")  # 再也不繼續後續驗證

5.再不改變模型狀況下修改值

#在form類中
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.字段名.choices = ((1, '籃球'), (2, '足球'), (3, '羽毛球'))

四.寫好的模板

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder='templates')
app.debug = True



class RegisterForm(Form):
    name = simple.StringField(
        label='用戶名',
        validators=[
            validators.DataRequired()
        ],
        widget=widgets.TextInput(),
        render_kw={'class': 'form-control'},
        default='cxw'
    )

    pwd = simple.PasswordField(
        label='密碼',
        validators=[
            validators.DataRequired(message='密碼不能爲空.')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )

    pwd_confirm = simple.PasswordField(
        label='重複密碼',
        validators=[
            validators.DataRequired(message='重複密碼不能爲空.'),
            validators.EqualTo('pwd', message="兩次密碼輸入不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )

    email = html5.EmailField(
        label='郵箱',
        validators=[
            validators.DataRequired(message='郵箱不能爲空.'),
            validators.Email(message='郵箱格式錯誤')
        ],
        widget=widgets.TextInput(input_type='email'),
        render_kw={'class': 'form-control'}
    )

    gender = core.RadioField(
        label='性別',
        choices=(
            (1, '男'),
            (2, '女'),
        ),
        #這句話的意思是上面的choices元組的第一個值是int類型
        #若是上上面爲(‘1’, '男'),(‘2’, '女'),則下面的coerce則不用寫
        coerce=int # 「1」 「2」
     )
    #這裏是單選框
    city = core.SelectField(
        label='城市',
        choices=(
            ('bj', '北京'),
            ('sh', '上海'),
        )
    )
    #這裏是多選框
    hobby = core.SelectMultipleField(
        label='愛好',
        choices=(
            (1, '籃球'),
            (2, '足球'),
        ),
        coerce=int
    )
    #這裏是多選的checkbox
    favor = core.SelectMultipleField(
        label='喜愛',
        choices=(
            (1, '籃球'),
            (2, '足球'),
        ),
        widget=widgets.ListWidget(prefix_label=False),
        option_widget=widgets.CheckboxInput(),
        coerce=int,
        default=[1, 2]
    )
    #這裏能夠改值
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.favor.choices = ((1, '籃球'), (2, '足球'), (3, '羽毛球'))

    def validate_pwd_confirm(self, field):
        """
        自定義pwd_confirm字段規則,例:與pwd字段是否一致
        :param field:
        :return:
        """
        # 最開始初始化時,self.data中已經有全部的值

            if field.data != self.data['pwd']:
            # raise validators.ValidationError("密碼不一致") # 繼續後續驗證
            raise validators.StopValidation("密碼不一致")  # 再也不繼續後續驗證


@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        #這裏能夠傳默認值
        form = RegisterForm(data={'gender': 2,'hobby':[1,]}) # initial
        return render_template('register.html', form=form)
    else:
        form = RegisterForm(formdata=request.form)
        if form.validate():
            print('用戶提交數據經過格式驗證,提交的值爲:', form.data)
        else:
            print(form.errors)
        return render_template('register.html', form=form)



if __name__ == '__main__':
    app.run()
相關文章
相關標籤/搜索