Flask_6

在Web程序中,表單是和用戶交互最常見的方式。用戶註冊、登陸、寫文章、編輯設置等等,都要用到表單。表單的處理包括了創建表單、驗證用戶輸入內容、錯誤提示、獲取和保存數據。我們可以通過WTForms--一個用Python編寫的表單庫 來解決這些問題。

 

HTML表單

Html中通過<form>標籤創建表單,表單中的字段用<input>標籤定義,<label>標籤用來定義字段的標籤文字。

 

WTForms支持在Python中使用類定義表單,然後通過類定義生成HTML代碼。這種方式更加簡便而且易於重用,所以我們一般不直接在模板中直接使用HTML編寫表單。

 

定義WTForms表單類

安裝flask-wtf庫後在Python shell中寫如下代碼

PyDev console: starting.
Python 3.6.6 |Anaconda custom (64-bit)| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)] on win32
from wtforms import *
from wtforms.validators import *
class LoginForm(Form):
    username = StringField('username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
    remrember = BooleanField('Remember me')
    submit = SubmitField('Log in')
    

實例化表單類,然後將實例屬性轉換爲字符串或者直接調用就可以獲取表單字段對應的HTML代碼。

form = LoginForm()
form.username()

'<input id="username" name="username" required type="text" value="">'

常用WTForms字段如下:

字段類型     

BooleanField                     複選框,值爲Ture或False

DateField                           文本字段,值會被處理成datetime.date對象

DateTimeField                   文本字段,值會被處理成datetiem.datetime對象

FileField                            文件上傳字段

FloatField                          浮點數字段

IntegerField                       整型字段

RadioField                         一組單選按鈕

SelectField                        下拉列表

SelectMultipleField            多選下拉列表

SubmitField                       提交按鈕

StringField                        文本字段

HiddenField                      隱藏文本字段

PasswordField                 密碼文本字段

TextAreaField                   多行文本字段

 

 

驗證器

驗證器是用於驗證字段數據的類,在實例化字段類時用validators關鍵字來指定附加的驗證器列表。驗證器從wtforms.validators模塊中導入。

常用的WTForms驗證器如下

DataRequired                           驗證數據是否有效

Email                                        驗證Email格式

EqualTo                                    驗證兩個字段是否相同

InputRequired                          驗證是否有數據

Length                                     驗證輸入長度是否在給定範圍以內

NumberRange                        驗證輸入數字是否在給定範圍內

Optional                                  允許輸入爲空並且跳過其他驗證

Regexp                                   使用正則表達式驗證輸入值

URL                                        驗證URL

AnyOf                                     確保輸入值在可選值列表中

NoneOf                                  確保輸入值在不可選列表中

 

 

輸出HTML代碼

在創建HTML表單時,我們經常需要使用<input>標籤的其他屬性來設置字段。比如添加class來設置CSS類型,添加placeholder來在輸入框內顯示文字等等。默認情況下,WTForms輸出的字段HTML代碼只包含id和name屬性,屬性值均爲表單類中對應的字段屬性名稱,要添加其他屬性,有以下兩種方法:

1.使用render_kw屬性

用render_kw屬性設置placeholder屬性

username = StringField('username', render_kw={'placeholder':'Your Username'})

輸出HTML代碼(這是在新寫的LoginForm2裏寫的)

>>> LoginForm2().username()
'<input id="username" name="username" placeholder="Your Username" type="text" value="">'

 

2.在調用字段時傳入

在調用字段屬性時,同過添加括號使用關鍵字參數的心事也可以傳入字段額外的HTML屬性

>>>form.username(style='width: 20px',class_='bar')
'<input class="bar" id="username" name="username" required style="width: 20px" type="text" value="">'

需要注意的是因爲class是Python中的關鍵字,在設置標籤的class屬性時用的是class_。

通過這種方法也可以修改id的值。但是name的屬性值不能修改,因爲表單被提交後,WTForms需要通過name屬性值來獲取對應數據所以不能修改name屬性值。

 

在模板中渲染表單

首先,在視圖函數裏實例化表單類,然後再render_template()函數中使用關鍵字參數form將表單實例傳入模板。

 

在app.py中寫好視圖函數並傳入表單

@app.route('/basic')
def basic():
    form = LoginForm()
    return render_template('login.html', form=form)

 

forms.py文件內容

from flask_wtf import FlaskForm
from wtforms import *
from wtforms.validators import DataRequired, Length


class LoginForm(FlaskForm):
    username = StringField('username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
    remember = BooleanField('Remember me')
    submit = SubmitField('Log in')

在模板(basic.html)中調用表單類的屬性獲取對應HTML代碼。

<form method="post">
    {{ form.csrf_token }}
    {{ form.username.label }}{{ form.username(placeholder='Your Name') }}<br>
    {{ form.password.label }}{{ form.password }}<br>
    {{ form.remember }}{{ form.remember.label }}<br>
    {{ form.submit }}<br>
</form>

運行結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章