04. 表單

4.2 表單類


from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required, EqualTo
# 定義一個(gè)表單類
class NameForm(Form):
    name=StringField('what is you name', validators=[Required()])   # 創(chuàng)建一個(gè)type=text的input
    submit=SubmitField('Submit')                                    # 創(chuàng)建一個(gè)type=submit的input
    conPassword=StringField('confirm password', validators=[EqualTo('password', message='must match')])   # message好像必須有

WTForms支持的HTML標(biāo)準(zhǔn)字段

字段類型 說(shuō)明
StringField 文本字段: input type="text"
TextAreaField 多行文本字段: textarea元素
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段弟劲,值為datetime.date格式
DateTimeField 文本字段勤晚,值為datetime.datetime格式
IntergerField 文本字段,值為整數(shù)
DecimalField 文本字段栈顷,十進(jìn)制芹敌,值為decimal.Deciamal
FloatField 文本字段,值為浮點(diǎn)數(shù)
BooleanField 復(fù)選框斗这,值為T(mén)rue或者False
RadioField 一組單選框斤寇,實(shí)例見(jiàn)下
SelectField 下拉列表,實(shí)例見(jiàn)下
SelectMultipleField 多選下拉列表
FileField 文件上傳字段
SubmitField 表單提交按鈕
FormField 把表單作為一個(gè)字段嵌入另一個(gè)表單
FieldList 一組制定類型的字段

幾個(gè)比較特殊的字段示意:

class NameForm(Form):
    radioSex=RadioField('性別', choices=[('1', '男人'), ('2', '女人')])
    selectHobby=SelectField('愛(ài)好', choices=[('3', '足球'), ('4', '籃球'), ('5', '乒乓')])
    # radioSex: 表單radio元素的name值
    # 第一個(gè)引號(hào)內(nèi): label值
    # choises=[]: 數(shù)組內(nèi)'1'為value值

WTFroms驗(yàn)證函數(shù)

驗(yàn)證函數(shù) 說(shuō)明
Email 驗(yàn)證電子郵件地址
EqualTo 比較兩個(gè)字段的值兄裂,例如兩次密碼驗(yàn)證
IPAddress 驗(yàn)證IPv4網(wǎng)絡(luò)地址
Length 驗(yàn)證輸入字符串的長(zhǎng)度
NumberRange 驗(yàn)證輸入的值在數(shù)字范圍內(nèi)
Optional 無(wú)輸入值時(shí)跳過(guò)驗(yàn)證其他函數(shù)
Required 確保字段有數(shù)據(jù)
Regexp 使用正則驗(yàn)證輸入值
URL 驗(yàn)證URL
AnyOf 確保輸入值在可選值列表中
NoneOf 確保輸入值不再可選值列表中

4.3 將表單渲染成HTML


{% extends "base.html" %} 
{% import "bootstrap/wtf.html" as wtf %} 
 
{% block title %}Flasky2b{% endblock %}
 
{% block page_content %} 
<div class="page-header"> 
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1> 
</div>
{#使用flask-bootstrap渲染表單#}
{{ wtf.quick_form(form) }} 
{% endblock %}

4.4 在視圖函數(shù)中處理表單


# -*- coding:utf-8 -*-

# 把 str 編碼由 ascii 改為 utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 以下載入包
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_moment import Moment              # 引入flask-moment
from datetime import datetime                # 引入datetime
from flask_wtf import Form
from wtforms import StringField,SubmitField,TextAreaField,IntegerField,BooleanField,RadioField,SelectField,FileField,PasswordField
from wtforms.validators import Required, email, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY']="string hard"
bootstrap=Bootstrap(app)
moment=Moment(app)
# 定義一個(gè)表單類
class NameForm(Form):
    name=StringField('what is you name', validators=[Required()])        # 創(chuàng)建一個(gè)type="text"的input句旱,文本傳入label標(biāo)簽
    password=PasswordField('password')
    conPassword=StringField('confirm password', validators=[EqualTo('password', message='must match')])
    intro=TextAreaField('introduce yourself')
    email=StringField('input your email', validators=[email()])          # 必須是email格式
    integer=IntegerField('input an integer')
    booleanC=BooleanField('choose/let')
    radioSex=RadioField('性別', choices=[('1', '男人'), ('2', '女人')])   # 創(chuàng)建type="radio"單選框
    selectHobby=SelectField('愛(ài)好', choices=[('3', '足球'), ('4', '籃球'), ('5', '乒乓')]) #創(chuàng)建select下拉框
    submit=SubmitField('Submit')                                         # 創(chuàng)建一個(gè)type="submit"的input
    fileload=FileField('上傳文件')
# 在視圖函數(shù)中處理表單
@app.route('/', methods=['GET', 'POST'])
def hello_world():                      # 在視圖函數(shù)中要定義name變量和form變量
    name=None
    intro=None
    form=NameForm()                     # 實(shí)例化一個(gè)NameForm()類
    if form.validate_on_submit():       # 表單驗(yàn)證成功,validate_on_submit()方法返回True
        name=form.name.data             #
        intro=form.intro.data
        form.name.data=''
    return render_template("form.html",
                           name=name,
                           intro=intro,
                           current_time=datetime.utcnow(),
                           form=form,
                           )

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

4.5 重定向和用戶會(huì)話


不要讓web程序?qū)OST請(qǐng)求作為瀏覽器發(fā)送的最后一個(gè)請(qǐng)求;
使用重定向后晰奖,原先的name=form.name.data獲取的數(shù)據(jù)就丟失了谈撒,所以要將數(shù)據(jù)存儲(chǔ)在用戶會(huì)話中,session

from flask import Flask, render_template, session, redirect, url_for 
 
@app.route('/', methods=['GET', 'POST']) 
def index(): 
    form = NameForm() 
    if form.validate_on_submit(): 

        session['name'] = form.name.data 
        return redirect(url_for('index'))   # 生成HTTP重定向響應(yīng)匾南,參數(shù)是重定向的URL
    return render_template('index.html', form=form, name=session.get('name'))
    # 使用.get('name')讀取避免未找到鍵的異常情況

4.6 flash消息


在視圖函數(shù)中使用flash()會(huì)生成一個(gè)消息啃匿,F(xiàn)lask把get_flashed_messages()函數(shù)開(kāi)放給模板,用于模板中獲取并渲染消息

{% block content %}
<div class='container'>
    {% for message in get_flashed_messages() %}
        <div class='alert alert-warning'>
            <button type='button' class='close' data-dismiss='alert'>×</button>
            {{ message }}
        </div>
    {% endfor %}
</div>
{% endblock %}
from flask import Flask,render_template,session,redirect,url_for,flash

@app.route('/',mrthod=['GET', 'POST'])
def index():
    form=NameForm()
    if form.validate_on_submit():
        old_name=session.get('name')
        if old_name is not None and old_name != form.name.data:
            flash('you changed your name!')
        session('name')=form.name.data
        return redirect(url_for('index'))
    return render_template('index.html', form=form, name=session.get('name'))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛆楞,一起剝皮案震驚了整個(gè)濱河市溯乒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豹爹,老刑警劉巖裆悄,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臂聋,居然都是意外死亡光稼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)孩等,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)艾君,“玉大人,你說(shuō)我怎么就攤上這事肄方”ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵权她,是天一觀的道長(zhǎng)虹茶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)隅要,這世上最難降的妖魔是什么蝴罪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮拾徙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘感局。我一直安慰自己尼啡,他們只是感情好暂衡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著崖瞭,像睡著了一般狂巢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上书聚,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天唧领,我揣著相機(jī)與錄音,去河邊找鬼雌续。 笑死斩个,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驯杜。 我是一名探鬼主播受啥,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸽心!你這毒婦竟也來(lái)了滚局?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顽频,失蹤者是張志新(化名)和其女友劉穎藤肢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體糯景,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘁圈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莺奸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丑孩。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灭贷,靈堂內(nèi)的尸體忽然破棺而出温学,到底是詐尸還是另有隱情,我是刑警寧澤甚疟,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布仗岖,位于F島的核電站,受9級(jí)特大地震影響览妖,放射性物質(zhì)發(fā)生泄漏轧拄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一讽膏、第九天 我趴在偏房一處隱蔽的房頂上張望檩电。 院中可真熱鬧,春花似錦、人聲如沸俐末。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卓箫。三九已至载矿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烹卒,已是汗流浹背闷盔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旅急,地道東北人逢勾。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坠非,于是被迫代替她去往敵國(guó)和親敏沉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 請(qǐng)求對(duì)象包含客戶端發(fā)出的所有請(qǐng)求信息炎码。其中 request.form 能獲取 POST 請(qǐng)求中提交的表單數(shù)據(jù)盟迟。 我...
    焉知非魚(yú)閱讀 1,121評(píng)論 0 2
  • HTML表單 在HTML中,表單是 ... 之間元素的集合潦闲,它們?cè)试S訪問(wèn)者輸入文本攒菠、選擇選項(xiàng)、操作對(duì)象等等歉闰,然后將...
    蘭山小亭閱讀 3,410評(píng)論 2 14
  • 第四章 Web表單 序:為什么需要Flask-wtf 第 2 章中介紹的請(qǐng)求對(duì)象包含客戶端發(fā)出的所有請(qǐng)求信息辖众。其中...
    科幻經(jīng)典閱讀 833評(píng)論 0 2
  • 第4章 Web表單 我們?cè)诘诙陆榻B過(guò)請(qǐng)求對(duì)象,它包含有客戶端請(qǐng)求的全部信息和敬。尤其是凹炸,可以通過(guò)request.fo...
    易木成華閱讀 1,009評(píng)論 0 1
  • 簡(jiǎn)介 Apache HBase 是Hadoop 的數(shù)據(jù)庫(kù),它是一種分布式的昼弟、可擴(kuò)展的啤它、適用于大數(shù)據(jù)的存儲(chǔ)。通過(guò)HB...
    eriolchan閱讀 450評(píng)論 0 1