web-dev-qa-db-ja.com

動的選択肢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>

ドロップダウンに正しいリストが表示され、送信時に正しい番号が表示されます。

Task:current_user.userIDに基づいて別のリストを渡す必要があります。私はSQLAlchemyを使用して、DBのテーブルからクエリを実行することでリストを形成しているので、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をstringに変換してから、intに戻す必要がありますか?タプルのようにそれをSelectFieldに渡す必要がありますか?
5
Oleg Somov

ここでの主なアイデアは、インスタンス化後に選択リストをフィールドに割り当てることです。そのためには、引数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"
15
Oleg Somov