Python 3.x 将参数传递给for循环中的视图函数(form),以填充Forms sqlalchemy表单

Python 3.x 将参数传递给for循环中的视图函数(form),以填充Forms sqlalchemy表单,python-3.x,flask,flask-sqlalchemy,flask-wtforms,Python 3.x,Flask,Flask Sqlalchemy,Flask Wtforms,我希望能够在我的网页上以可更新的预填充表单的形式显示数据库模型的行!我可以轻松地在页面上显示行,我可以为每行添加链接以打开单独的页面编辑每行,我还可以使用更新表单显示每行,但我无法显示填充的表单。这是我的密码: @bp.route('/stock', methods=['GET', 'POST']) @bp.route('/stock/<int:id>', methods=['GET', 'POST']) @login_required def stock(id=None):

我希望能够在我的网页上以可更新的预填充表单的形式显示数据库模型的行!我可以轻松地在页面上显示行,我可以为每行添加链接以打开单独的页面编辑每行,我还可以使用更新表单显示每行,但我无法显示填充的表单。这是我的密码:

@bp.route('/stock', methods=['GET', 'POST'])
@bp.route('/stock/<int:id>', methods=['GET', 'POST'])
@login_required
def stock(id=None):
    if id is not None:
        obj = Stock.query.get_or_404(id)
        form = AddStockForm(request.form, obj=obj)
        if form.validate_on_submit():
            form.populate_obj(obj)
            db.session.commit()
        return redirect(url_for('stock.stock'))
    else:
        form = AddStockForm()
        page = request.args.get('page', 1, type=int)
        stock = Stock.query.order_by(Stock.id.desc()).paginate(
        page, current_app.config['ITEMS_PER_PAGE'], False)
        next_url = url_for('stock.stock', page=stock.next_num) \
            if stock.has_next else None
        prev_url = url_for('stock.stock', page=stock.prev_num) \
            if stock.has_prev else None
        return render_template('stock/stock.html',form=form, title=Stock, stock=stock.items,
             next_url=next_url, prev_url=prev_url)
为了消除上述错误,我在“stock.html代码”中也遇到了类似的错误

我改为:

   {% include {{ url_for('stock._stock', id=['s.id']) }} %}
这给了我以下错误:

jinja2.exceptions.TemplateSyntaxError: expected token ':', got '}'

我使用不同的方法预填充表单

总之,我为每个表单字段设置了默认值,并在呈现之前处理表单。在下面的示例中,我使用
form.account\u name.default=account.ackname
设置account\u name字段的默认值,然后在呈现表单之前调用
form.process()

@web.route('/accounts/modify/<int:accno>/', methods=['GET', 'POST'])
@login_required
def modify_account(accno):
    """
    Modify or delete accounts.
    Return a form for modifying accounts or process submitted
    form and redirect to Accounts HTML page.
    """
    group = current_user.group()
    try:
        account = Account.query.filter_by(group=group, accno=accno).one()
    except NoResultFound:
        flash('Invalid account.')
        return redirect(url_for('.accounts_page'))
    accounts = current_user.group().accounts
    form = ModifyAccountForm()
    form.account_name.default = account.accname

    if form.validate_on_submit():
        if form.modify.data:
            for item in accounts:
                if (
                    item.accname == form.account_name.data and
                    item.accname != form.account_name.default
                ):
                    flash('Another account already has this name.')
                    return redirect(url_for('.modify_account', accno=accno))
            account.accname = form.account_name.data
            db.session.add(account)
            db.session.commit()
        elif form.delete.data:
            for transaction in current_user.group().transactions:
                if transaction.account == account:
                    unknown_account = Account.query.filter_by(
                        group=current_user.group(), accname='Unknown').one()
                    transaction.account = unknown_account
                    db.session.add(transaction)
                    db.session.commit()
            db.session.delete(account)
            db.session.commit()
        elif form.cancel.data:
            pass
        return redirect(url_for('.accounts_page'))

    form.process()  # Do this after validate_on_submit or breaks CSRF token

    return render_template(
        'modify_account.html', form=form, accno=accno, menu="accounts")
@web.route('/accounts/modify/',方法=['GET','POST'])
@需要登录
def修改账户(账号):
"""
修改或删除帐户。
返回用于修改提交的帐户或流程的表单
表单并重定向到帐户HTML页面。
"""
组=当前用户组()
尝试:
account=account.query.filter_by(group=group,accno=accno).one()
除NoResultFound外:
闪存(“无效帐户”)
返回重定向(url_for('.accounts_page'))
accounts=当前用户组()帐户
表单=修改AccountForm()
form.account\u name.default=account.accname
if form.validate_on_submit():
如果form.modify.data:
对于账户中的项目:
如果(
item.accname==form.account\u name.data和
item.accname!=form.account\u name.default
):
flash('另一个帐户已具有此名称')
返回重定向(url_for('.modify_account',accno=accno))
account.accname=form.account\u name.data
db.session.add(帐户)
db.session.commit()
elif form.delete.data:
对于当前_user.group()中的事务。事务:
如果transaction.account==账户:
未知\u帐户=account.query.filter\u by(
group=current_user.group(),accname='Unknown')。one()
transaction.account=未知的\u帐户
db.session.add(事务)
db.session.commit()
db.session.delete(帐户)
db.session.commit()
elif form.cancel.data:
通过
返回重定向(url_for('.accounts_page'))
form.process()#在_提交时验证_或中断CSRF令牌后执行此操作
返回渲染模板(
“modify_account.html”,form=form,accno=accno,menu=“accounts”)

我使用不同的方法预填充表单

总之,我为每个表单字段设置了默认值,并在呈现之前处理表单。在下面的示例中,我使用
form.account\u name.default=account.ackname
设置account\u name字段的默认值,然后在呈现表单之前调用
form.process()

@web.route('/accounts/modify/<int:accno>/', methods=['GET', 'POST'])
@login_required
def modify_account(accno):
    """
    Modify or delete accounts.
    Return a form for modifying accounts or process submitted
    form and redirect to Accounts HTML page.
    """
    group = current_user.group()
    try:
        account = Account.query.filter_by(group=group, accno=accno).one()
    except NoResultFound:
        flash('Invalid account.')
        return redirect(url_for('.accounts_page'))
    accounts = current_user.group().accounts
    form = ModifyAccountForm()
    form.account_name.default = account.accname

    if form.validate_on_submit():
        if form.modify.data:
            for item in accounts:
                if (
                    item.accname == form.account_name.data and
                    item.accname != form.account_name.default
                ):
                    flash('Another account already has this name.')
                    return redirect(url_for('.modify_account', accno=accno))
            account.accname = form.account_name.data
            db.session.add(account)
            db.session.commit()
        elif form.delete.data:
            for transaction in current_user.group().transactions:
                if transaction.account == account:
                    unknown_account = Account.query.filter_by(
                        group=current_user.group(), accname='Unknown').one()
                    transaction.account = unknown_account
                    db.session.add(transaction)
                    db.session.commit()
            db.session.delete(account)
            db.session.commit()
        elif form.cancel.data:
            pass
        return redirect(url_for('.accounts_page'))

    form.process()  # Do this after validate_on_submit or breaks CSRF token

    return render_template(
        'modify_account.html', form=form, accno=accno, menu="accounts")
@web.route('/accounts/modify/',方法=['GET','POST'])
@需要登录
def修改账户(账号):
"""
修改或删除帐户。
返回用于修改提交的帐户或流程的表单
表单并重定向到帐户HTML页面。
"""
组=当前用户组()
尝试:
account=account.query.filter_by(group=group,accno=accno).one()
除NoResultFound外:
闪存(“无效帐户”)
返回重定向(url_for('.accounts_page'))
accounts=当前用户组()帐户
表单=修改AccountForm()
form.account\u name.default=account.accname
if form.validate_on_submit():
如果form.modify.data:
对于账户中的项目:
如果(
item.accname==form.account\u name.data和
item.accname!=form.account\u name.default
):
flash('另一个帐户已具有此名称')
返回重定向(url_for('.modify_account',accno=accno))
account.accname=form.account\u name.data
db.session.add(帐户)
db.session.commit()
elif form.delete.data:
对于当前_user.group()中的事务。事务:
如果transaction.account==账户:
未知\u帐户=account.query.filter\u by(
group=current_user.group(),accname='Unknown')。one()
transaction.account=未知的\u帐户
db.session.add(事务)
db.session.commit()
db.session.delete(帐户)
db.session.commit()
elif form.cancel.data:
通过
返回重定向(url_for('.accounts_page'))
form.process()#在_提交时验证_或中断CSRF令牌后执行此操作
返回渲染模板(
“modify_account.html”,form=form,accno=accno,menu=“accounts”)

要创建一个HTML页面,其中每个记录有一个表单,每个记录有一个单独的提交按钮,您需要在视图/路由功能中创建多个表单,然后在HTML模板中循环浏览所有表单

视图/路线:

@web.route('/stocks', methods=['GET', 'POST'])
def stocks():
    """Return Stocks HTML page."""
    stocks = Stock.query.all()
    forms = []
    for stock in stocks:
        form = ModifyStockForm()
        form.stock_id.default = stock.stock_id
        form.stock_name.default = stock.stock_name
        forms.append(form)

    for form in forms:
        if form.validate_on_submit():
            if form.modify.data:
                stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            stock.stock_name = form.stock_name.data
            db.session.add(stock)
            db.session.commit()
        elif form.delete.data:
            stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            db.session.delete(stock)
            db.session.commit()
        return redirect(url_for('.stocks'))

        form.process()  # Do this after validate_on_submit or breaks CSRF token

return render_template('stocks.html', forms=forms, stocks=stocks)
模板:

<h2>Stocks:</h2>

   {% for form in forms %}

    <form method="post" role="form" enctype="multipart/form-data">
        {{ form.hidden_tag() }}

        {{ form.stock_id }}
        {{ form.stock_name }}
        {{ form.modify }}
        {{ form.delete }}

    </form>

   {% endfor %}
股票:
{表格%中的表格为%}
{{form.hidden_tag()}}
{{form.stock_id}
{{form.stock_name}
{{form.modify}}
{{form.delete}
{%endfor%}

我在本报告中给出了一个完整的示例:

要创建一个HTML页面,其中每个记录都有一个表单,每个记录都有一个单独的提交按钮,您需要在视图/路由函数中创建多个表单,然后在HTML模板中循环所有表单

视图/路线:

@web.route('/stocks', methods=['GET', 'POST'])
def stocks():
    """Return Stocks HTML page."""
    stocks = Stock.query.all()
    forms = []
    for stock in stocks:
        form = ModifyStockForm()
        form.stock_id.default = stock.stock_id
        form.stock_name.default = stock.stock_name
        forms.append(form)

    for form in forms:
        if form.validate_on_submit():
            if form.modify.data:
                stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            stock.stock_name = form.stock_name.data
            db.session.add(stock)
            db.session.commit()
        elif form.delete.data:
            stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            db.session.delete(stock)
            db.session.commit()
        return redirect(url_for('.stocks'))

        form.process()  # Do this after validate_on_submit or breaks CSRF token

return render_template('stocks.html', forms=forms, stocks=stocks)
模板:

<h2>Stocks:</h2>

   {% for form in forms %}

    <form method="post" role="form" enctype="multipart/form-data">
        {{ form.hidden_tag() }}

        {{ form.stock_id }}
        {{ form.stock_name }}
        {{ form.modify }}
        {{ form.delete }}

    </form>

   {% endfor %}
股票:
{表格%中的表格为%}
@web.route('/accounts/modify/<int:accno>/', methods=['GET', 'POST'])
@login_required
def modify_account(accno):
    """
    Modify or delete accounts.
    Return a form for modifying accounts or process submitted
    form and redirect to Accounts HTML page.
    """
    group = current_user.group()
    try:
        account = Account.query.filter_by(group=group, accno=accno).one()
    except NoResultFound:
        flash('Invalid account.')
        return redirect(url_for('.accounts_page'))
    accounts = current_user.group().accounts
    form = ModifyAccountForm()
    form.account_name.default = account.accname

    if form.validate_on_submit():
        if form.modify.data:
            for item in accounts:
                if (
                    item.accname == form.account_name.data and
                    item.accname != form.account_name.default
                ):
                    flash('Another account already has this name.')
                    return redirect(url_for('.modify_account', accno=accno))
            account.accname = form.account_name.data
            db.session.add(account)
            db.session.commit()
        elif form.delete.data:
            for transaction in current_user.group().transactions:
                if transaction.account == account:
                    unknown_account = Account.query.filter_by(
                        group=current_user.group(), accname='Unknown').one()
                    transaction.account = unknown_account
                    db.session.add(transaction)
                    db.session.commit()
            db.session.delete(account)
            db.session.commit()
        elif form.cancel.data:
            pass
        return redirect(url_for('.accounts_page'))

    form.process()  # Do this after validate_on_submit or breaks CSRF token

    return render_template(
        'modify_account.html', form=form, accno=accno, menu="accounts")
@web.route('/stocks', methods=['GET', 'POST'])
def stocks():
    """Return Stocks HTML page."""
    stocks = Stock.query.all()
    forms = []
    for stock in stocks:
        form = ModifyStockForm()
        form.stock_id.default = stock.stock_id
        form.stock_name.default = stock.stock_name
        forms.append(form)

    for form in forms:
        if form.validate_on_submit():
            if form.modify.data:
                stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            stock.stock_name = form.stock_name.data
            db.session.add(stock)
            db.session.commit()
        elif form.delete.data:
            stock = Stock.query.filter_by(stock_id=form.stock_id.data).one()
            db.session.delete(stock)
            db.session.commit()
        return redirect(url_for('.stocks'))

        form.process()  # Do this after validate_on_submit or breaks CSRF token

return render_template('stocks.html', forms=forms, stocks=stocks)
<h2>Stocks:</h2>

   {% for form in forms %}

    <form method="post" role="form" enctype="multipart/form-data">
        {{ form.hidden_tag() }}

        {{ form.stock_id }}
        {{ form.stock_name }}
        {{ form.modify }}
        {{ form.delete }}

    </form>

   {% endfor %}