2012-08-23 30 views
25

WFormsでSelectFieldのデフォルト値を設定しようとすると、私は値を 'default'パラメータに渡します。WTForms SelectFieldのデフォルト値はどのように設定しますか?

class TestForm(Form): 
    test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=2) 

また、次のことも試しました。

class TestForm(Form): 
    test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=(2, "Def")) 

デフォルトの選択フィールドを "Def"に設定しないでください。これは、TextFieldなどの他の種類のフィールドでも機能します。どのようにSelectFieldのデフォルト値を設定しますか?

答えて

20

あなたが投稿した最初の方法は正しいです、それは私のために働く。それはあなたがWTFormsの古いバージョンを実行していることを可能に動作していないための唯一の説明は、それは私がこの問題は何かをdefaultを上書きFielddata属性によって引き起こされると考えてい

+1

あなたが正しいです:

は、ここでそれを行うための新しい方法です。私は以前のバージョンを実行していた。 – jan

21

1.0.1に私のために働いていますWTFormsは理解しません(例えば、DBモデルオブジェクト - それはintを予期します)。あなたがそうのようにコンストラクタでフォームを埋めている場合に発生します:いくつかの方法があります

form = PostForm(obj=post) 
form.category.data = (post.category.id 
         if page.category 
         else 0) # I make 0 my default 
+1

実行時にビューから選択肢を動的に取り込む場合、これはデフォルトで1つの選択肢を選択する正しい方法です。 Googleはこの質問に多くの人々を惹きつけているので、これはおそらく受け入れられた答えだろう。 –

+0

さて、答えに感謝しました。これは選択された回答でなければなりません – JMS

+1

私は、デフォルトのオプションをビューのリストから別のものに変更してフォームを送信すると、新しいオプションの代わりにデフォルトのオプションが提出されることに気付きました。どのようにしてこの問題を修正できますか? – nikitz

11

:解決策は、フォームが読み込まれた後、手動でdata属性を設定することです

form = PostForm(obj=post) 

これをする。あなたの最初のコードスニペットは本当に正しいです。

あなたはかかわらず、動的ビューでこれを実行したい場合は、あなたも行うことができます:あなたはintを使用する場合

form = TestForm() 
form.test_field.default = some_default_id 
form.process() 
3

これはSelectFieldchoices設定され、それは次のように動作します。

test_select = SelectField("Test", coerce=int, choices=[(0, "test0"), (1, "test1")], default=1) 

か:

class TestForm(Form): 
    test_select = SelectField("Test", coerce=int) 

@app.route("/test") 
def view_function(): 
    form = TestForm() 
    form.test_select.choices = [(0, "test0"), (1, "test1")] 
    form.test_select.default = 1 
    form.process() 
+1

2番目の変種をテストしましたか? 'form.test_select.default = 1'を呼んでも私のシステム上は何も変わりません。 – Robert

+0

最後に、動作するもの!! –

4

Flask-WTF 0.14.2ユーザーはここにいます。だから、この答えは、私と同様の問題を抱えている人のためです。

基本的には、以前の解決策のどれもform.validate_on_submit()では正しく機能しません。

ページがロードされたときに実際にデフォルト値を変更しますform.test_field.dataを設定するが、データが同じvalidate_on_submit後のまま(ブラウザでユーザーが変更しても効果はありません)。

form.test_field.defaultを設定すると、form.process()を呼び出しても、ページがロードされたときに値が変更されますが、validate_on_submitは失敗します。

class TestForm(Form): 
    test_field = SelectField("Test", choices=[(0, "test0"), (1, "test1")]) 

@app.route("/test") 
def view_function(): 
    form = TestForm(test_field=1) 
    if form.validate_on_submit(): 
    ... 
関連する問題