簡體   English   中英

動態選擇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通過從數據庫表中查詢來形成列表,所以My 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時,是否需要將groupID轉換為字符串 ,然后再轉換為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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM