📜  Flask-WTF 从数据库中选择字段 (1)

📅  最后修改于: 2023-12-03 15:15:05.870000             🧑  作者: Mango

Flask-WTF 从数据库中选择字段

Flask-WTF 是一个用于表单处理的 Flask 扩展,它可以轻松地集成 WTForms 表单库并提供 CSRF 保护。

在 Flask 中,从数据库中选择字段可能是一个常见的任务。Flask-WTF 提供了一个 QuerySelectField 字段类型,允许从数据库中选择一个查询结果集。该字段类型的定义如下:

class QuerySelectField(SelectFieldBase):
    """
    A SelectField that allows you to lazily (efficiently) populate the\
    choices for the field from a database.
    """
    def __init__(self, label=None, validators=None, query=None, get_label=None,
                 allow_blank=False, blank_text='', **kwargs):
        """
        `label` is the label for the field. Use either this or `description`.
        `validators` is a list of validators to call when `validate` is called.
            They are called in the order they are provided.
        `query` is the query that's executed for the available options.
        `get_label` is a callable that returns the text to show for each option;
            it's passed the model object passed to the constructor.
        `allow_blank` determines if an empty value is added to the list
            of available options.
        `blank_text` is the text to show for the empty value if `allow_blank`
            is True. By default, this is an empty string.
        """
        super(QuerySelectField, self).__init__(label, validators, **kwargs)
        self.query = query
        self.get_label = get_label
        self.allow_blank = allow_blank
        self.blank_text = blank_text

其中,query 参数是一个查询结果集,get_label 参数是一个返回该字段选项的文本值的函数。

接下来,我们将演示如何从数据库中选择一个文件,该文件存储在 SQLite 数据库中。首先,我们需要安装所需的依赖项:

$ pip install Flask Flask-WTF SQLAlchemy

然后,我们可以创建一个简单的 SQLite 数据库并添加文件记录:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.sqlite'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'mysecret'

db = SQLAlchemy(app)


class File(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)


@app.route('/', methods=['GET', 'POST'])
def index():
    class FileSelectForm(FlaskForm):
        file = QuerySelectField('File', query=File.query, allow_blank=True)

    form = FileSelectForm()

    if form.validate_on_submit():
        return 'Selected file: {}'.format(form.file.data.name)

    return form.as_p()


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

这里我们定义了一个 File 类,该类使用 SQLAlchemy 进行映射。我们还定义了一个 FileSelectForm 类,该类包含一个 QuerySelectField 字段,它从数据库中选择文件记录。如果用户提交表单,则在服务器上打印所选文件的名称。最后,我们使用 Flask 的 as_p 方法将表单呈现为 HTML。

现在,我们可以运行该应用程序并访问 http://localhost:5000/ 来尝试选择一个文件。如果我们将鼠标悬停在选择框上,我们可以看到它包含名为 “File 1” 和 “File 2” 的两个文件选项:

Flask-WTF 从数据库中选择字段

在提交表单后,我们将看到所选文件的名称:

$ flask run
...
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
...
$ curl -XPOST -F'file=1' http://localhost:5000/
Selected file: File 1

这就是 Flask-WTF 从数据库中选择字段的基础知识。使用 QuerySelectField 和 SQLAlchemy,您可以轻松地从 Flask 应用程序中的数据库中选择结果集。