2017-01-02 11 views
0

Flask-wtformsで次のコードを使用しています。 SelectFieldでさまざまなバリデータを使用した場合と使用しなかった場合を試しましたが、ユーザーがフォーム検証を提出して初めてfalseを返します。フラスコのWTFのバリデーション最初のサブミットではFalse、2番目ではTrue

さらにバリデーションメソッドを削除しようとしましたが、SelectFieldにバリデータを残しておき、最初のサブミット時に検証がFalseを返します。

SelectFieldが-1の値に設定されていないかどうかを知りたいと思っています(つまり、ビューメソッドによって設定されていて、現在アクティブなアイテムがユーザーに満足していると思われます)。私はわからない、なぜ第二私は、文字列を使用したフォーム

forms.py

something = SelectField(label = 'Something', choices = [('-1','Select Something')], default=('-1','Select Something'), id='select_something', validators=[validators.DataRequired(message='Nothing selected')]) 
#NB the line below with no validator also prints "--validate() returned false" 
#something = SelectField(label = 'Something', choices = [('-1','Select Something')], default=('-1','Select Something'), id='select_something') 
submit = SubmitField('Submit') 

def validate(self): 
    rv = Form.validate(self) 
    if not rv: 
     print("--validate() returned false") 
     return False 

    #the line below never fired, see fix in following line 
    #if self.something.data == -1: 
    if str(self.something.data) == '-1': 
     logger.debug("--validate() data==-1") 
     return False 
    return True 

view.py

form = Something(request.form) 
if request.method == 'GET': 
    #get tuple_list from database 
    ... 
    form.something.choices = tuple_list 
    form.something.default = tuple_list[0] 

if request.method == 'POST' and form.validate(): 
    print('Something added.') 
+1

何 ' form.errorsは言う?あなたのテンプレートに 'form.csrf_token'を含めて、あなたの設定に' SECRET'キーをセットしましたか? – MrLeeh

+0

@MrLeeh、thanks、errors empty、crsf、scret_keyがOKに設定されています。私はいくつかの問題を発見しました - 一つは検証メソッド - データは-1と決して同じではありません。また、request.method == 'GET'ブロックに問題がありましたが、whileを削除して作業しています。 –

答えて

1

に他に何も選択されていないにもかかわらず、提出する上で有効な場合、フォーム(つまり、(1、 'text')でなければなりません)、デフォルトを正しく設定しないでください(デフォルト= n、ここでn =整数)。

注意ここに見られるようなform.process()の呼び出し:以下How do you set a default value for a WTForms SelectField?

修正:

views.py

form = Something(request.form) 
#get tuple_list from database 
... 
form.something.choices = tuple_list 
form.something.default = tuple_list[0][0] #integer id value 
form.process() 
if request.method == 'POST' and form.validate(): 
    return self.render_template('it_works.html') 
return self.render_template('select_something.html') 

forms.py

#no validator used here 
something = SelectField(label = 'Something', choices = [], id='select_something') 
submit = SubmitField('Submit') 

def validate(self): 
    if len(self.something.choices) == 0: 
     return False 
    return True 
+0

OMG。これは本当の人生の救い主です。ありがとうございました – Nabin

関連する問題