Python 如何使用Flask中的字典创建动态选择表单?

Python 如何使用Flask中的字典创建动态选择表单?,python,python-2.7,dictionary,flask,flask-wtforms,Python,Python 2.7,Dictionary,Flask,Flask Wtforms,我在字典中有一个列表,其结构如下: spotDictionary={Firm,{Product,[Spot]} 我想有三个选择领域公司,产品,现货。从左到右,用户应该从每个选项中选择一个每个选择字段应动态填充与公司或产品对应的选项。 换句话说,当我选择FirmA时,我应该只看到FirmA的产品。当我选择FirmA的相应产品时,我应该只获得该产品的斑点。填充所有3个select字段后,用户可以提交表单 下面是我如何创建公司列表,并将其用作我的第一个选择字段(公司)。我想在下面的select字段中

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

spotDictionary={Firm,{Product,[Spot]}
我想有三个选择领域公司,产品,现货。从左到右,用户应该从每个选项中选择一个每个选择字段应动态填充与公司或产品对应的选项。

换句话说,当我选择FirmA时,我应该只看到FirmA的产品。当我选择FirmA的相应产品时,我应该只获得该产品的斑点。填充所有3个select字段后,用户可以提交表单

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

firmList=已排序([[i,i]表示spotDictionary.keys()中的i]

一旦用户选择了一家公司,下一个选择字段的选项应该是“公司产品”和“仅公司产品”。一旦用户选择了一个产品,该选项对于Spot应该是相同的。

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

如果不想多次调用db,可以将其存储在会话变量中

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

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>

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

您在这里没有使用wtforms。这并不难做到,但您没有使用您所说的技术are@roganjosh我打算使用它,但想将它与字典一起使用。我对这个回答充满希望——这似乎是我可能需要的。现在我将使用它。在第一个if语句中,我为第二种形式。