【问题标题】:How can I create a dynamic select form using a dictionary in Flask?如何在 Flask 中使用字典创建动态选择表单?
【发布时间】:2019-12-03 03:31:33
【问题描述】:

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

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

我想要 3 个选择字段公司、产品、现货。从左到右,用户应该从每个中选择一个。 每个选择字段都应使用与公司或产品对应的选项动态填充选项。

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

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

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

一旦用户选择了一家公司,下一个选择字段的选项应该是该公司产品和该公司产品。用户选择产品后,Spot 的设置应该相同。

【问题讨论】:

  • 你这里没有使用 wtforms。做起来并不难,但你并没有使用你所说的技术
  • @roganjosh 我打算使用它,但想将它与字典一起使用。

标签: python python-2.7 dictionary flask flask-wtforms


【解决方案1】:

我最近做了类似的事情,在同一个模板中使用多个表单并调用了多个 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>

【讨论】:

  • 我对这个回复充满希望——似乎是我可能需要的。现在会玩这个。
  • 我得到 NoneType is not iterable 在我为第二种形式分配选项的第一个 if 语句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多