如何在Flask中使用SelectField并获取多个值

1 投票
1 回答
4351 浏览
提问于 2025-04-18 10:55

我需要用Flask设计一个网页。在这个网页上,我要让用户选择多个字段,比如分支、名字,还要从用户那里获取一个文本字段。

下面是我的表单类(forms.py):

class ProjectSelect(Form):
   branch = SelectField('Branch')
   name = SelectField('Name)
   comments = TextField('Comments')

我的View.py如下:

  @app.route('/user/<email>', methods=["GET", "POST"])
  def user(email):
    branch_list = Dummy.query.all()
    name_list = Dummy1.query.all()
    form = ProjectSelect()
    form.branch.choices = branch_list
    form.name.choices = name_list
    if form.validate_on_submit():
       # How to get data??
       return redirect(url_for('index'))

    return render_template('index.html')

目前,我还没有为这个设置设计HTML模板。因为我对HTML和Flask都很陌生,所以不太确定该怎么写。根据视图的要求,我需要实现两个选择框,一个是分支列表,另一个是名字列表。我还需要一个提交按钮,用来从这两个选择框和一个文本框中获取数据,并把这些数据传回我的view.py。我该怎么做呢?

接下来,名字选择框的内容是依赖于分支选择框中选的值的。我该如何在HTML中动态更新选择框,以实现这个功能呢?

1 个回答

2

你在这个帖子里问了几个问题。

1) 要获取数据(在 if form.validate_on_submit(): 之后),你可以使用类似下面的代码:

`if form.validate_on_submit():
       branch = form.branch.data
       name = form.name.data
       # do something with branch and name
       return redirect(url_for('index'))`

2) 你的视图应该看起来像这样:

`<form method="post">
{{ form.csrf_token }}
{{ form.branch.label }}{{ form.branch }}
{{ form.name.label }} {{ form.name }}
{{ form.comments.label}} {{ form.comments }}
{{ form.submit }}
</form>`

3) 在你的 ProjectSelect 类定义中缺少提交字段。你需要添加:

`submit = SubmitField("Submit")`

注意:确保你在文件顶部的导入语句中包含以下内容:

from wtforms import SubmitField, SelectField

4) 在你的 views.py 文件的最后一行,那里有 return render_template('index.html'),你需要传入表单对象:

return render_template('index.html', form=form)

5) 要实现一个带有预定义选项的 SelectField,可以使用这个:

name = SelectField('Name', choices=name_choices)

注意:这假设 name_choices 是像这样定义的列表:

name_choices = ['选择一', '选择二']

6) 你的代码示例在 ProjectSelect 类中有一个语法错误:

[查找]

name = SelectField('Name)

[替换为]

name = SelectField('Name')

撰写回答