如何在WTF Flask表单中发送隐藏字段以插入数据库

2 投票
1 回答
1503 浏览
提问于 2025-04-18 05:20

我该如何在一个WTF表单中指定多个数据库字段,以便能正确地在数据库中插入一行数据呢?我需要在我的模板中有这样的东西:

        {{ wtf.form_field(gform.GHF(value="{{ project.name }}")) }}

因为我正在处理一个(项目)到多个(目标)的关系
项目 -(有多个目标)
-目标-

而我的目标表单会显示多次。

{% for project in P %}
  {% for pgoal in project.goals.all() %}
    <li>
    Goal:  {{ pgoal.goal }}<br>
    {% if loop.last %}
    <form class="form form-horizontal" method="post" role="gform">
    {{ gform.hidden_tag() }}
    {{ wtf.form_errors(gform) }}
    {{ wtf.form_field(gform.goal) }}
               Help here?  do i need a hiddenfield to know which project?
    {{ wtf.form_field(gform.submit) }}<br>
    and so on...

一旦我找到了正确的项目,我会在这里的视图中使用它。

    u=models.Projects.query.get(correct project?)
    p=models.Goals(goal=gform.goal.data,proj=u)

1 个回答

2

我不会用隐藏字段来处理这个问题。我会让每个表单的提交方式稍微不同一些。

你应该有类似这样的东西:

<form class="form form-horizontal" method="post" role="gform" 
 action="{{ url_for('add_goal_to_project', project_id=project.id) }}">

而这个路由应该是:

@app.route('.../<int:project_id>', methods=['POST'])
def add_goal_to_project(project_id):
    gform = GForm(....)
    if gform.validate_on_submit():
        project = models.Projects.query.get(project_id)
        goal = models.Goals(gform.goal.data, proj=project)
        # Do anything else you need to do, such as adding and committing
        # the new object
        return redirect(...)
    return render_template(...)

我省略了一些关于表单创建、重定向和渲染模板的细节,但这样应该能让你明白大概意思。每个目标表单的动作指向一个由项目ID构建的路由。

你可以扩展这个功能,让用户能够编辑目标,如果再加上一些不错的ajax请求,效果会更好。

撰写回答