【问题标题】:Dynamically Update WTForm with SQL-Alchemy query使用 SQL-Alchemy 查询动态更新 WTForm
【发布时间】:2016-12-24 18:35:04
【问题描述】:

我试图通过从表中检索信息来动态更新表单,然后在 SelectField 中显示其中一列。当我输入资产标签时,选择一个任务标题并点击提交,什么都没有发生。

编辑:我应该添加表格更新正常 - 我的所有选择都在那里并且被成功检索。之后它根本不执行我的任何视图功能。

我的表格如下;

class AssignTasksForm(Form):
    asset_tag = StringField('asset_tag', validators=[DataRequired()])
    task_title = SelectField('task_title', validators=[DataRequired()])

我的视图功能;

@tasks_blueprint.route('/assign_tasks', methods=['GET', 'POST'])
@login_required
def assign_tasks():
    form = AssignTasksForm()
    form.task_title.choices = [(tc.task_id, tc.task_title) for tc in Tasks.query.order_by('task_id')]
    if request.method == 'POST':
        if form.validate_on_submit():
            try:
                asset_tag = form.asset_tag.data
                asset = Motor.query.filter_by(asset_tag = asset_tag).first_or_404()
                task_title = form.task_title.data
                task = Tasks.query.filter_by(task_title = task_title).first_or_404()
                task.asset_tasks.append(asset)
                db.session.commit()
            except Exception as e:
                flash(e)
                db.session.rollback()
    return render_template('assign_tasks.html', form=form)

我的终端输出让我相信在从表中检索数据后表单可能会失效:

2016-08-17 18:21:56,568 INFO sqlalchemy.engine.base.Engine {'id_1': 1, 'param_1': 1}
2016-08-17 18:21:56,577 INFO sqlalchemy.engine.base.Engine SELECT tasks."Task Title" AS "tasks_Task Title", tasks."Description" AS "tasks_Description", tasks.task_id AS tasks_task_id
FROM tasks ORDER BY tasks.task_id
2016-08-17 18:21:56,577 INFO sqlalchemy.engine.base.Engine {}
108.168.36.217 - - [17/Aug/2016 18:21:56] "POST /tasks/assign_tasks HTTP/1.1" 200 -

您可以看到它运行视图中概述的查询,然后发布网页,但它根本不继续执行视图功能的其余部分。

这是我的模板:

{% extends "basehead.html" %}
{% block content %}
  <center>
    <div class="container">
      <h2>Assign Tasks Below</h2>
      <br>
      <form action="" method="post" name="submit">
      {{ form.hidden_tag() }}
     <p>
        {{ form.asset_tag(placeholder=" Enter Asset Tag") }}
     </p>
     <p>
         {{ form.task_title }}
     </p>
        <input class="btn btn-default" type="submit" value="Submit">
      </form>
    </div>
    {% if result_message %}
    <br>
       <p class="result_message"> {{ result_message }} </p>
    </br>
    {% endif %}
    </center>
{% endblock %}

【问题讨论】:

  • 您可以在validate_on_submit之后打印表单数据,查看您的表单内容。
  • @EmL 好的,我在if request.method == 'POST': 之后添加了flash(form.task_title.choices),它成功地刷新了从查询中检索到的所有选项。所以我怀疑有些东西阻止它被验证_on_submit。
  • 尝试在 validate_on_submit() 函数处设置断点,并进行调试。或者将SelectField 替换为QuerySelectField,我在需要动态字段时使用QuerySelectField

标签: python flask sqlalchemy flask-wtforms


【解决方案1】:

试试下面的。 http://hastebin.com/obojivosar.py

您无需检查if request.method == "POST": 我只是将选项的填充移至视图底部。在validate_on_submit 之前我从来没有接触过表单 另外result_message 是如何进入模板的上下文的?

【讨论】:

  • 我认为这不可能,因为正如我所提到的,它只适用于空字段而不是下拉选择字段。我无论如何都试过了,没有运气。不过谢谢。
  • 我会说,然后在您进入视图后立即放置打印语句,然后在每个 if 语句之后立即放置。看看你能走多远。
  • 我原始帖子的另一条评论提到了这一点。正如我所怀疑的那样,我得到了'if form.validate_on_submit():'。验证中的某些内容不喜欢查询返回的列表。
  • 我尝试了您在 OP 中编辑的内容,但没有成功,因为我找到了验证解决方案。我必须编辑我的task_title 对象以包含coerce=int 以告诉WTForms 将tc.task_id 数据作为整数而不是字符串来处理。但这让我遇到了另一个问题,我得到了这个问题。 :( !
  • 我会的,必须等待 2 天,然后才能将自己的评论标记为答案。
【解决方案2】:

我发现了问题,

WTForms 希望将查询返回的数据作为字符串处理,但是 ID(整数)显然不是字符串,这一定是验证失败的原因。

通过在我的表单定义中将coerce=int 添加到我的task_title 对象,WTForms 现在知道将其作为 int 进行处理并通过验证。

固定代码:

class AssignTasksForm(Form):
    asset_tag = StringField('asset_tag', validators=[DataRequired()])
    task_title = SelectField('task_title', coerce=int, validators=[DataRequired()])

来源:Not a Valid Choice for Dynamic Select Field WTFORMS

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多