动态选择 WTForms Flask SelectField
Dynamic choices WTForms Flask SelectField
我正在尝试使用 FlaskForms 将 userID 变量传递给 WTForms。首先,我将展示工作正常的代码,然后展示我需要修改的内容(我不知道如何修改的部分)。我正在添加与某个组关联的新名称。
FlaskForm 型号:
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])
查看模型:
@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"
模板:
<form method="POST" action="/dashboard/addname">
<h2>Add name</h2>
{{ form.hidden_tag() }}
{{ wtf.form_field(form.name) }}
{{ wtf.form_field(form.groupID) }}
<button type="submit">Add name</button>
</form>
我在下拉列表中看到正确的列表,并且在提交时给我正确的数字。
任务: 我需要根据 current_user.userID 传递不同的列表。
我正在使用 SQLAlchemy 形成列表,通过从数据库 table 进行查询,所以我的 Flask 视图是:
@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"
- 如何将我的 groups_list 传递给表格?我试图在 FlaskForm 模型中实现成型过程,但它没有看到 current_user object
- 当我需要像元组一样将其传递给 SelectField 时,是否需要将 groupID 转换为 string 然后再转换回 int?
这里的主要思想是在实例化后将选择列表分配给字段。为此,您需要使用参数 coerce=int
。 SelectField 的 coerce 关键字 arg 表示我们使用 int() 来强制表单数据。默认强制是 unicode()。
正确的 FormModel:
class AddName(FlaskForm):
name =StringField('Device name', validators=[InputRequired(),Length(min=4, max=30)])
groupID = SelectField('Payload Type', coerce=int, validators=[InputRequired])
正确观点:
@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"
我正在尝试使用 FlaskForms 将 userID 变量传递给 WTForms。首先,我将展示工作正常的代码,然后展示我需要修改的内容(我不知道如何修改的部分)。我正在添加与某个组关联的新名称。
FlaskForm 型号:
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])
查看模型:
@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"
模板:
<form method="POST" action="/dashboard/addname">
<h2>Add name</h2>
{{ form.hidden_tag() }}
{{ wtf.form_field(form.name) }}
{{ wtf.form_field(form.groupID) }}
<button type="submit">Add name</button>
</form>
我在下拉列表中看到正确的列表,并且在提交时给我正确的数字。
任务: 我需要根据 current_user.userID 传递不同的列表。 我正在使用 SQLAlchemy 形成列表,通过从数据库 table 进行查询,所以我的 Flask 视图是:
@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"
- 如何将我的 groups_list 传递给表格?我试图在 FlaskForm 模型中实现成型过程,但它没有看到 current_user object
- 当我需要像元组一样将其传递给 SelectField 时,是否需要将 groupID 转换为 string 然后再转换回 int?
这里的主要思想是在实例化后将选择列表分配给字段。为此,您需要使用参数 coerce=int
。 SelectField 的 coerce 关键字 arg 表示我们使用 int() 来强制表单数据。默认强制是 unicode()。
正确的 FormModel:
class AddName(FlaskForm):
name =StringField('Device name', validators=[InputRequired(),Length(min=4, max=30)])
groupID = SelectField('Payload Type', coerce=int, validators=[InputRequired])
正确观点:
@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"