2016-09-26 21 views
2

Flask-WTFormsには、各フィールドのバリデーターごとにカスタムメッセージを与えることができます。しかし、RadioFieldの場合、デフォルトのメッセージのみが表示されます。以下は例です。Flask-WTForms RadioFieldカスタムバリデーターメッセージが機能しない

>>> from wtforms import Form, RadioField, TextField 
>>> from wtforms.validators import * 

のTextField

>>> class MyForm(Form): 
     x = TextField(u'Some text', validators = [Required(message="Hello")]) 

エラーメッセージ

>>> form = MyForm() 
>>> form.x.data 
>>> form.validate() 
False 
>>> form.errors 
{'x': ['Hello']} 

だからTextFieldのためには、カスタムエラーメッセージが表示されます。

>>> form = MyForm() 
>>> form.x.data 
u'None' 
>>> form.validate() 
False 
>>> form.errors 
{'x': [u'Not a valid choice']} 

RadioField

>>> class MyForm(Form): 
     x = RadioField(choices = [(1, '1'), (2, '2')], validators = [Required(message="Hello")]) 

エラーメッセージは、カスタムエラーメッセージはありません。私は、TextFieldRadioFieldの検証は異なるプロセスになると思われ、それがデフォルトのメッセージを表示しているのかもしれません。

私の質問は、RadioFieldの検証のカスタムメッセージを表示する方法ですか?

+0

解決策を見つけましたか? – roy

+0

私はソースコードを修正しようとしましたが、まだ解決策はありませんでした。 – RatDon

答えて

1

あなたはプロセスが異なっているということは間違いありません。

source codeに行くとメソッドではFieldクラスがあります。それは

""" 
Validates the field and returns True or False. `self.errors` will 
contain any errors raised during validation. This is usually only 
called by `Form.validate`. 

Subfields shouldn't override this, but rather override either 
`pre_validate`, `post_validate` or both, depending on needs.> 

:param form: The form the field belongs to. 
:param extra_validators: A sequence of extra validators to run. 
""" 

語っだと検証の手順はpre_validate()ある - >validate() - >post_validate()( - >ファイル名を指定して実行バリ - pre_validateを呼び出し>post_validateコール)あなたが推測できるとおりRadioFieldはそれがだ持って、

を独自のpre_validate()メソッドですが、基本的にSelectFieldのものです。そして、RadioFieldSelectFieldから継承されているときもそれがあります。

def pre_validate(self, form): 
    for v, _ in self.choices: 
     if self.data == v: 
      break 
    else: 
     raise ValueError(self.gettext('Not a valid choice')) 

あなたが代わりにカスタム1の'Not a valid choice'エラーが出る理由はそれだけでpre_validate()を経由しませんでしたし、それが停止したため、だからwtforms.validators.Required()バリ、に、です。

Requiredバリデータがdepracatedされ、WTForms 3.0で削除され、thatプルリクエストで、彼らはすでにそれは使い方だ削除。代わりにRequired()バリで、DataRequired()

UPDATEを使用する:あなたは、あなたのバリデータを追加しているので、まだあなたのフィールドにあなたのエラーを取得することができるはずです。pre_validate()だけValueErrorを提起するのでので、それはvalidate()

# Call pre_validate 
try: 
    self.pre_validate(form) 
except StopValidation as e: 
    if e.args and e.args[0]: 
     self.errors.append(e.args[0]) 
    stop_validation = True 
except ValueError as e: 
    self.errors.append(e.args[0]) 

を停止していませんし、それは

# Run validators 
if not stop_validation: 
    chain = itertools.chain(self.validators, extra_validators) 
    stop_validation = self._run_validation_chain(form, chain) 

に進み、ここであなたのバリデータが存在していると、新しいエラーを追加する必要がありますエラーのリスト(form.x.error)に変換しますが、None'None'に変換します。ので、あなたのform.x.data'None'strタイプ)になり、今では__call__

def __call__(self, form, field): 
    if not field.data or isinstance(field.data, string_types) and not field.data.strip(): 
     if self.message is None: 
      message = field.gettext('This field is required.') 
     else: 
      message = self.message 

     field.errors[:] = [] 
     raise StopValidation(message) 

AND条件not field.dataに行くfield.data'None'あるので、Falseです。 Noneから'None'へのデータがSelectFieldで変換される理由は、Issue on GitHubで説明されており、Pull Requestがマスターにマージされると、おそらく修正される可能性があります。

+0

情報ありがとうございます。私はコード内の 'DataRequired()'に置き換えました。しかし、どうすれば 'RadioField' Validationのデフォルトメッセージを上書きできますか?カスタムメソッドを定義する必要はありますか? – RatDon

+1

@RatDon質問を更新しました。あなたのアプローチに間違いはありませんが、依然としてカスタムメッセージを「有効な選択ではありません」と一緒に見ることができるはずです。しかし、セレクトフィールド(SelectField)とその親戚には少しばかり問題があります。したがって、あなたの選択の1つは、 'form.x.data'が' None'かどうかを手動でチェックすることです。もう1つは[pull](https://github.com/wtforms/wtforms/pull/288)を持つ[そのフォーク](https://github.com/georgschoelly/wtforms/tree/no_coerce_none)です。 –

+0

が見つかりましたソースとそのプルで述べたように修正。しかし効果はありません。 :-( – RatDon

関連する問題