动态选择 WTForms Flask SelectField

16

我试图在使用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 从数据库表中进行查询来生成列表,因此我的 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"
  1. 我该如何将我的groups_list传递给表单?我尝试在FlaskForm模型中实现形成过程,但它无法看到current_user对象。
  2. 当我需要将groupID传递给SelectField时,我是否需要将其转换为字符串,然后再转换回整数,以便像元组一样传递?
  1. 我该如何将我的groups_list传递给表单?我尝试在FlaskForm模型中实现表单过程,但它无法访问current_user对象。
  2. 当我需要将groupID传递给SelectField时,我需要将其转换为字符串,然后再转换回整数,以便像元组一样传递吗?

有没有更好的方法来做这件事?比如使用元类或其他什么东西? - Nilesh
1个回答

37

这里的主要思想是在实例化后将选项列表分配给字段。为此,您需要使用参数coerce=int。SelectField的coerce关键字参数表示我们使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接