首页 > 解决方案 > 用数据库数据填充 flask_wtf 表单 - 数据库创建中断

问题描述

我正在尝试研究如何使用 flask_wtf 让动态驱动的表单在 Flask 中工作。我想从 flask_sqlalchemy 数据库中获取值来填充选择。如果数据库已经创建,我有这个工作。如果我想填充一个新的数据库,它会以一种奇怪的方式中断,并且似乎卡在了db.create_all()步骤上。如果我向服务器发送请求,我会收到 SQL 错误,因为架构尚不存在。当我注释掉 forms.py 中的违规行时,数据库创建得很好。然后我可以取消注释该行并且我的数据库驱动选项完美运行!

我猜这些表单是在数据库初始化之前呈现的 - 如果有人对我应该如何设置它有任何指导,将不胜感激。

我还尝试了 wtforms.ext.sqlalchemy有点工作但坚持__repr__以表格输出。在任何情况下 wtforms.ext.sqlalchemy 都被贬低并移出到似乎已经死亡的wtforms/wtforms-sqlalchemy 。

塔,

安德鲁

我的路线.py

"""Logged-in page routes."""
from flask import Blueprint, redirect, render_template, url_for
from flask_login import current_user, login_required, logout_user
from .forms import DashboardForm

# Blueprint Configuration
main_bp = Blueprint(
    'main_bp', __name__,
    template_folder='templates',
    static_folder='static'
)


@main_bp.route('/', methods=['GET'])
@login_required
def dashboard():
    """Logged-in User Dashboard."""
    form = DashboardForm()
    return render_template(
        'dashboard.jinja2',
        title='Flask-Login Tutorial.',
        template='dashboard-template',
        current_user=current_user,
        body="You are now logged in!",
        form=form
    )

我的表格.py

"""Sign-up & log-in forms."""
from flask_wtf import FlaskForm
from wtforms import SelectField, PasswordField, StringField, SubmitField
from wtforms.validators import DataRequired
from .models import db, User


def user_choices():
    output_list = []
    result = db.session.query(User).all()
    for row in result:
        output_list.append((row.id, row.name))
    return output_list


class DashboardForm(FlaskForm):
    """Test to populate from from db data"""
    # name = StringField('Users', validators=[DataRequired(), ])
    name = SelectField('boat_type', choices=user_choices(), validators=[DataRequired(), ])
    submit = SubmitField('Submit')

我的 __ 初始化 __.py

"""Initialize app."""
from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
# from ddtrace import patch_all


# patch_all()
db = SQLAlchemy()
login_manager = LoginManager()


def create_app():
    """Construct the core app object."""
    app = Flask(__name__, instance_relative_config=False)
    app.config.from_object('config.Config')

    # Initialize Plugins
    db.init_app(app)
    login_manager.init_app(app)

    with app.app_context():
        from . import routes
        from . import auth
        from .assets import compile_static_assets

        # Register Blueprints
        app.register_blueprint(routes.main_bp)
        app.register_blueprint(auth.auth_bp)

        # Create Database Models
        db.create_all()

        # Compile static assets
        if app.config['FLASK_ENV'] == 'development':
            compile_static_assets(app)

        return app

标签: pythonflasksqlalchemyflask-sqlalchemyflask-wtforms

解决方案


推荐阅读