2016-03-29 18 views
0

私はFloatFieldとIntegerFieldを求めるフォームを持っています。ユーザーがmuxlevelフィールドに、0.5を言う入るとDjango forms.FloatFieldとIntegerFieldは、検証エラーなしでテキスト入力を受け入れる

conc = forms.FloatField(label='Concentration (uM)',required=False) 
muxlevel = forms.IntegerField(label='Multiplex level ',required=False) 

、)(form.is_validはFalseを返し、フォームは

が言って返される "整数を入力します。"

これは私が期待しているものです(実際は最高です)。しかし、ユーザーがいずれかのフィールドにテキストを入力すると、 'asdf'と入力すると検証は行われず、form.is_valid()はTrueを返し、form.cleaned_data ['muxlevel']の値はNoneになります。 FloatField concにテキストを入力する場合も同じことが起こります。

これは私が期待していたものではなく、「整数を入力してください」または「浮動小数点値を入力してください」というフォームに戻ります。

私は検索しましたが、この問題は報告されていません。ドキュメントは

  • は、データへの正規化...と言う事実:Pythonのfloat型
  • 与えられた値であることを検証したフロート
  • 先頭と末尾の空白はPythonのフロート()関数のように、許可されています。

EDIT - ビューが

from .forms import * 
def scr_query(request): 
    summ = '' 
    if request.method == "POST": 
     form = QueryForm(request.POST) 

     if form.is_valid(): 

      if (form.cleaned_data['conc']):   
       summ += "Concentration < " + str(form.cleaned_data['conc_upper']) + "<br>" 
      if (form.cleaned_data['muxlevel']): 

       summ += "Muxlevel > " + str(form.cleaned_data['muxlevel']) + "<br>" 

のように見え、この

class QueryForm(forms.Form): 

    conc = forms.FloatField(label='Concentration (uM)',required=False) 
    muxlevel = forms.IntegerField(label='Multiplex level ',required=False) 

私の読みが実際に提供する文字列をかどうかを確認するために呼び出されるPythonのフロート()と言われますようにフォームが見えますフロートに強制することができます。私がfloat( 'abc')を使ってコンソールでそれを行うと、予想される例外が発生します。なぜそれがNoneに変換されているのかは分かりません。 float()の呼び出しの前に何らかの形のテキストストリッピングが起こっているので、空白の値が得られ、float( '')はNoneを返すでしょうか?

ご協力いただければ幸いです。

ありがとうございました。

+0

あなたはどのバージョンのDjangoを使用していますか?あなたの意見を見せてもらえますか? – Alasdair

+0

@ Alisdair、Django 1.8.9、このビューを表示するように編集されました。それ以外はうまく動作しますが、それは予想どおりに動作しない検証です。ありがとう。 –

+0

投稿した字下げが正しく表示されません。完全な 'QueryForm'を表示できますか?値が存在することを確認するために 'request.POST'を印刷/ロギングしてみてください。 – Alasdair

答えて

1

@Alasdairが言いましたように、問題はrequest.POSTです。それはフィールドのためのデータを含んでいません。しかし、これはウィジェットです。デフォルトでDjangoはforms.NumberInputを使用しています(あなたのローカライゼーションの設定に依存します)。これは、非数値データが要求に応じて送信されることを防ぎます。したがって、muxlevel = forms.IntegerField(label='Multiplex level ',required=False, widget=forms.TextInput())に変更すると、正しいエラーメッセージが表示されます。

関連する問題