使用SQL-Alchemy查询动态更新WTForm

时间:2016-08-17 23:41:37

标签: python flask sqlalchemy flask-wtforms

我正在尝试通过从表中检索信息来动态更新表单,然后显示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 %}

2 个答案:

答案 0 :(得分:1)

尝试以下方法。 http://hastebin.com/obojivosar.py

您无需检查if request.method == "POST":我只是将选项的填充移动到视图的底部。我从未在validate_on_submit之前触摸表单。result_message如何进入模板的上下文?

答案 1 :(得分:0)

我发现了这个问题,

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

通过在我的表单定义中向/^\(0[236789]\)\s(\d){8}$/ 对象添加coerce=int,WTForms现在知道将其作为int处理并通过验证。

固定代码:

task_title

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