如何在 Flask 中使用字典创建动态 select 表单?

How can I create a dynamic select form using a dictionary in Flask?

我在字典中的字典中有一个列表,其结构如下:

spotDictionary = {Firm, {Product, [Spot]}}

我想要 3 个 select 字段 Firm、Product、Spot。从左到右,用户应该 select 每人一个。 每个 select 字段应动态填充与公司或产品对应的选项。

也就是说,当我selectFirmA时,我应该只会看到FirmA的产品。当我 select FirmA 的相应产品时,我应该只获得该产品的 Spots。填充所有 3 select 字段后,用户可以提交表单。

下面是我如何创建我用作第一个 select 字段(公司)选择的公司列表。我想在后面的 select 字段中使用类似的逻辑。 我不想查询数据库,因为我已经有一个 spotDictionary。

firmList = sorted([[i, i] for i in spotDictionary.keys()]

一旦用户 select 成为公司,下一个 select 字段的选项应该是公司产品和仅公司产品。一旦用户 select 成为产品,这对于 Spot 应该是相同的。

我最近做了类似的事情,在同一模板中使用多个表单并调用多个 render_template。每个表单在更改时提交并填充下一个表单。

如果你不想多次调用数据库,你可以将它存储在会话变量中。

这没有经过测试,但大致如下:

class Firm(FlaskForm):
    firm = SelectField('firm', coerce=str, validators=[InputRequired()])
class Prod(FlaskForm):
    prod = SelectField('prod', coerce=str, validators=[InputRequired()])
class Spot(FlaskForm):
    spot = SelectField('spot', coerce=str, validators=[InputRequired()])

@app.route
def route(): 

    if form1.validate_on_submit():
        form2.prod.choices = session.data.prodlistfunction
        return render_template("/", form1=form1, form2=form2, form3=form3)

    if form2.validate_on_submit():
        form3.spot.choices = session.data.spotlistfunction
        return render_template("/", form1=form1, form2=form2, form3=form3)

    if form3.validate_on_submit():
        do.something()

    data=db.call()
    session.data = data
    form1 = Firm()
    form2 = Prod()
    form3 = Spot()
    form1.choices = data.somefunction()  
    # give other forms blank choices to start off with
    form2.choices = ["",""]
    form3.choices = ["",""]   

    return render_template("/", form1=form1, form2=form2, form3=form3)

然后模板类似于

<form>
{{ form1.csrf_token }}
{{ form1.firm(onchange='this.form.submit()') }}
</form>
<form>
{{ form2.csrf_token }}
{{ form2.prod(onchange='this.form.submit()') }}
</form>
<form>
{{ form3.csrf_token }}
{{ form3.spot(onchange='this.form.submit()') }}
</form>