生成表单
在HTML中,表单通过<form>标签创建,表单中使用<input>标签表示各种输入字段,<label>标签用来定义标签文字。例如下面的HTML表单:
<form method="post">
<label for="username">Username</label><br>
<input type="text" name="username" placeholder="Héctor Rivera"><br>
<label for="password">Password</label><br>
<input type="password" name="password" placeholder="19001130"><br>
<input id="remember" name="remember" type="checkbox" checked>
<label for="remember"><small>Remember me</small></label><br>
<input type="submit" name="submit" value="Log in">
</form>
渲染后的效果如下:
WTForms是一个使用Python编写的表单库,它使得表单的定义、验证(服务器端)和处理变得非常轻松。
WTForms支持在Python中使用类定义表单,然后直接通过类定义生成对应的HTML代码,这种方式更方便且表单更易于重用。因此,除非是非常简单的程序,否则不会在模板中直接使用HTML编写表单。Flask-WTF集成了WTForms,使用它可以在Flask中更加方便地使用WTForms。
当使用WTForms创建表单时,表单由Python自定义类表示(例如下面的LoginForm类)这个类继承从WTForms导入的Form基类。一个表单由若干输入字段组成,这些字段分别用表单类的类属性(例如username、password)来表示。每个字段属性通过实例化WTForms提供的字段类表示。字段属性的名称将作为对应HTML<input>元素的name属性及id属性值。
例如下面的代码会生成前面一样的表单:
### 文件forms.py ###
from wtforms import Form, StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length
class LoginForm(Form):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
remember = BooleanField('Remember me')
submit = SubmitField('Log in')
### 文件app.py ###
from flask import Flask, render_template
import os
from forms import LoginForm
app = Flask(__name__)
app.secret_key = "secret string"
app.secret_key = os.getenv('SECRET_KEY', 'secret string')
@app.route('/basic')
def basic():
form = LoginForm()
return render_template('basic.html', form=form)
### 文件basic.html ###
<!DOCTYPE html>
<form method="post">
{
{
form.csrf_token }}
{
{
form.username.label }}<br>