Flask-wtforms類似django中的form組件

来源:https://www.cnblogs.com/pythonywy/archive/2019/10/01/11616321.html
-Advertisement-
Play Games

一.安裝 二.簡單使用 1.創建flask對象 二.生成form組件 三.路由 四.頁面渲染 三.相關屬性 1.field欄位 WTForms支持HTML欄位: | 欄位類型 | 說明 | | | | | StringField | 文本欄位, 相當於type類型為text的input標簽 | | ...


一.安裝

pip3 install wtforms

二.簡單使用

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欄位:

欄位類型 說明
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可以支持很多表單的驗證函數:

驗證函數 說明
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()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、FTP服務概述: FTP伺服器(File Transfer Protocol Server)是在互聯網上提供文件存儲和訪問服務的電腦,它們依照FTP協議提供服務。 FTP(File Transfer Protocol: 文件傳輸協議)作用: Internet 上用來傳送文件的協議 可以在區域網 ...
  • 一.硬碟介面 從整體的角度上,硬碟介面分為IDE、SATA、SCSI和SAS四種,IDE介面硬碟多用於家用產品中,也部分應用於伺服器,SCSI介面的硬碟則主要應用於伺服器市場,而SAS只在高端伺服器上,價格昂貴。二.硬碟種類 SATA硬碟:用SATA介面的硬碟又叫串口硬碟,是以後PC機的主流發展方向 ...
  • 1、版本:一般MSSQL2016以下版本使用。 2、適用小資料庫容量的異地備份;如果是資料庫容量較大,產生的日誌比較多;經測試,9G的資料庫大小,鏡像數月個日誌大小達到400G,硬碟開銷太大。 ...
  • `為了自己能更加好的查看自己的總結以及讓關註我的小可愛們能更加好的學習我弄了閱讀模式` 一.直接上代碼 二.補充hover特效 三.效果展示 ...
  • Webstorm作為前端開發的主流工具,對Git及Github可以非常簡便的集成。 1、開發環境:(如何安裝就不說了) ① Webstorm 2018 ② git version 2.20.1 ③ Github註冊用戶 2、Webstorm的工具設置: ① 菜單項File下的Settings,搜索g ...
  • 1.html5的優點: ①對人友好,更加語義化,更直觀,增加了代碼的可讀性。 ②對電腦友好,瀏覽器更容易解析,搜索引擎更容易抓取文檔內容。 ③代碼更加的簡潔。 2.新增的佈局標簽: Article:定義一個獨立內容區塊,一篇文章,一個視頻等; Section:定義一個區域,如文章的章節等; Hea ...
  • 1.基本結構 (1) <!doctype html> doctype 的中文意思是‘’文檔類型‘’ 標記語言的文檔類型,告訴瀏覽器使用什麼樣的文檔類型來解析HTML文檔 (2) <meta charset="utf-8"> <meta>元素用於指定字元串編碼類型直接使用charset屬性指定字元串編 ...
  • 文章首發於公眾號 松花皮蛋的黑板報 作者就職於京東,在穩定性保障、敏捷開發、高級JAVA、微服務架構有深入的理解 最近在我身上發生了這麼一件事。我主要負責內容創作的,提供了一個寫入的邏輯介面,但是在校驗鏈中對圖片來源空間包括功能變數名稱進行了校驗,你可以理解空間是一種業務名位置,空間涉及到精細化成本管理。接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...