2017-10-25 106 views
0

私はFlaskFormsでWTFormsにuserID変数を渡そうとしています。最初に、うまく動作するコードを表示し、次に変更する必要があるコードを表示します(これは私には分かりません)。私はいくつかのグループに関連付けられた新しい名前を追加しています。動的選択WTForms Flask SelectField

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> 

私が見コドロップダウンリストを作成し、submitを押すと正しい番号が返されます。

タスク:に基づいて別のリストをに渡す必要があります。 マイフラスコビューがあるので、私は、DBからテーブルからクエリを行うことによって、SQLAlchemyのを使用してリストを形成しています:

@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. を見ていない私は戻ってint型に私はタプルのようなSelectFieldにそれを渡す必要があるときに文字列にグループIDを変換する必要があるとか?

答えて

0

ここでの主なアイデアは、インスタンス化後に選択リストをフィールドに割り当てることです。これを行うには、引数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" 
関連する問題