Dynamic choices WTForms Flask SelectField
我正在尝试通过FlaskForms将userID变量传递给WTForms。 首先,我将显示可以正常工作的代码,然后显示需要修改的内容(该部分我不知道如何)。 我要添加与某个组关联的新名称。
FlaskForm模型:
1 2 3 | class AddName(FlaskForm): name =StringField('Device name', validators=[InputRequired(),Length(min=4, max=30)]) groupID = SelectField('Payload Type', choices=[(1,"Group1"),(2,"Group2")], validators=[InputRequired]) |
查看模型:
1 2 3 4 5 6 7 8 | @app.route('/dashboard/addname', methods=['GET', 'POST']) def addname(): form=AddName() if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return"New name added" |
模板:
1 2 3 4 5 6 7 | <form method="POST" action="/dashboard/addname"> Add name {{ form.hidden_tag() }} {{ wtf.form_field(form.name) }} {{ wtf.form_field(form.groupID) }} <button type="submit">Add name</button> </form> |
我在下拉列表中看到正确的列表,并且在提交时会给我正确的数字。
任务:我需要基于current_user.userID传递不同的列表。
我正在使用SQLAlchemy通过从数据库表中查询来形成列表,所以My Flask视图是:
1 2 3 4 5 6 7 8 9 10 11 | @app.route('/dashboard/addname', methods=['GET', 'POST']) def addname(): available_groups=db.session.query(Groups).filter(Groups.userID == currend_user.userID).all() #Now forming the list of tuples, so it's ok for SelectField groups_list=[(i.groupID, i.groupName) for i in available_groups] form=AddName() if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return"New name added" |
这里的主要思想是在实例化之后将选择列表分配给该字段。 为此,您需要使用参数
正确的FormModel:
1 2 3 | class AddName(FlaskForm): name =StringField('Device name', validators=[InputRequired(),Length(min=4, max=30)]) groupID = SelectField('Payload Type', coerce=int, validators=[InputRequired]) |
正确的视图:
1 2 3 4 5 6 7 8 9 10 11 12 13 | @app.route('/dashboard/addname', methods=['GET', 'POST']) def addname(): available_groups=db.session.query(Groups).filter(Groups.userID == currend_user.userID).all() #Now forming the list of tuples for SelectField groups_list=[(i.groupID, i.groupName) for i in available_groups] form=AddName() #passing group_list to the form form.groupID.choices = groups_list if form.validate_on_submit(): name=Name(form.name.data,form.groupID.data) db.session.add(name) db.session.commit() return"New name added" |