动态选择 WTForms Flask SelectField

Posted

技术标签:

【中文标题】动态选择 WTForms Flask SelectField【英文标题】:Dynamic choices WTForms Flask SelectField 【发布时间】:2018-04-05 22:01:45 【问题描述】:

我正在尝试使用 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"
    如何将我的 groups_list 传递给表单?我尝试在 FlaskForm 模型中实现成型过程,但它没有看到 current_user 对象 当我需要像元组一样将 groupID 传递给 SelectField 时,是否需要将 groupID 转换为 string 然后再转换回 int

【问题讨论】:

有没有更好的方法来做到这一点?喜欢使用元类什么的? 【参考方案1】:

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

【讨论】:

以上是关于动态选择 WTForms Flask SelectField的主要内容,如果未能解决你的问题,请参考以下文章

Flask WTForms 动态表单依赖项 selectField 未填充在编辑页面中

Wtforms:如何使用具有动态选择值的选择字段生成空白值

如何使 Flask-WTForms 从标签名称列表中动态更新标签?

在烧瓶 wtforms jinja select 上设置动态数据属性

当我将 POST 与 Flask 一起使用时,我遇到了 wtforms 选择字段的问题

使用从前一个字段中选择的值填充 WTForms 选择字段