W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
如果您不得不跟瀏覽器提交的表單數(shù)據(jù)打交道,視圖函數(shù)里的代碼將會很快變得 難以閱讀。有不少的代碼庫被開發(fā)用來簡化這個過程的操作。其中一個就是 WTForms , 這也是我們今天主要討論的。如果您發(fā)現(xiàn)您自己陷入處理很多表單的境地,那您也許 應(yīng)該嘗試一下他。
要使用 WTForms ,您需要先將您的表單定義為類。我建議您將應(yīng)用分割為多個模塊 (大型應(yīng)用) ,這樣的話您僅需為表單添加一個獨立的模塊。
挖掘 WTForms 的最大潛力
Flask-WTF 擴展在這個模式的基礎(chǔ)上擴展并添加了一些隨手即得的精巧 的幫助函數(shù),這些函數(shù)將會使在 Flask 里使用表單更加有趣,您可以通過 PyPI 獲取它。
以下是一個典型的注冊頁面的例子:
from wtforms import Form, BooleanField, TextField, PasswordField, validators
class RegistrationForm(Form):
username = TextField('Username', [validators.Length(min=4, max=25)])
email = TextField('Email Address', [validators.Length(min=6, max=35)])
password = PasswordField('New Password', [
validators.Required(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.Required()])
在視圖函數(shù)中,表單的使用是像下面這個樣子的:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
user = User(form.username.data, form.email.data,
form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
注意到我們視圖中使用了 SQLAlchemy (參考 在 Flask 中使用 SQLAlchemy )。但是 這并非必要的,請按照您的需要修正代碼。
備忘表:
在模板這邊,如果您將表單傳遞給模板,您可以很容易地渲染他們。參看如下代碼, 您就會發(fā)現(xiàn)這有多么簡單了。WTForms 已經(jīng)為我們完成了一半的表單生成工作。更 棒的是,我們可以編寫一個宏來渲染表單的字段,讓這個字段包含一個標簽,如果 存在驗證錯誤,則列出列表來。
以下是一個使用這種宏的 _formhelpers.html 模板的例子:
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
這些宏接受一對鍵值對,WTForms 的字段函數(shù)接收這個宏然后為我們渲染他們。 鍵值對參數(shù)將會被轉(zhuǎn)化為 HTML 屬性,所以在這個例子里,您可以調(diào)用 render_field(form.username,class="username") 來將一個類添加到這個 輸入框元素中。請注意 WTForms 返回標準 Python unicode 字符串,所以我們 使用 |safe 告訴 Jinjan2 這些數(shù)據(jù)已經(jīng)是經(jīng)過 HTML 過濾處理的了。
以下是 register.html 模板,它對應(yīng)于上面我們使用過的函數(shù),同時也利用 了 _formhelpers.html 模板:
{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
關(guān)于 WTForms 的更多信息,請訪問 WTForms 網(wǎng)站 。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: