2017-02-02 7 views
0

私はカスタムフロートフィールド(MyFloatField)を使用する複数のフォームを用意しています。Python Flask WTFormsカスタムFloatFieldは1つのフォームクラスでのみ機能します

,を置き換えることができるようにカスタムフロートフィールドを作成しました。ユーザーが, - 20,00のフロートを入力すると、20.00が20.00になります。私はそれが正常に動作し形式を持つ

class MyFloatField(FloatField): 
    def process_formdata(self, valuelist): 
     if valuelist: 
      try: 
       self.data = float(valuelist[0].replace(',', '.')) 
      except ValueError: 
       self.data = None 
       raise ValueError(self.gettext('Kein valider Wert')) 

は、ここに私のカスタムFloatFieldです。

class ZimmerForm(Form): 
    preis = MyFloatField('Preis pro Person', validators=[Optional()]) 
    preis_doppelzimmer = MyFloatField('Preis pro Person', validators=[Optional()]) 
    preis_mehrbettzimmer = MyFloatField('Preis pro Person', validators=[Optional()])  
    preis_wohunung = MyFloatField('Preis pro Person', validators=[Optional()]) 

私は同じ動作が必要ないくつかの他の形式もありますが、動作しないようです。私はDataError取得しています:

DataError: (psycopg2.DataError) FEHLER: ungültige Eingabesyntax für Typ double precision: â12,90â 
LINE 1: ...zimmer SET anzahl_zimmer='2', personen='2', preis='12,90' WH... 
                  ^
[SQL: 'UPDATE einzelzimmer SET anzahl_zimmer=%(anzahl_zimmer)s, personen=%(personen)s, preis=%(preis)s WHERE einzelzimmer.id = %(einzelzimmer_id)s'] [parameters: {'einzelzimmer_id': 50, 'anzahl_zimmer': u'2', 'personen': u'2', 'preis': u'12,90'}] 

は、私の知る限り ,とフロートを理解するように交換されていません。ここで

は私の他の形態である:

class EditZimmerForm_Einzel(Form): 
    preis = MyFloatField('Preis pro Person', validators=[DataRequired(message="Geben Sie an wie teuer eine Nacht pro Person ist")]) 

class EditZimmerForm_Doppel(Form): 
    preis_doppelz = MyFloatField('Preis pro Person', validators=[DataRequired(message="Geben Sie an wie teuer eine Nacht pro Person ist")]) 

class EditZimmerForm_Mehrbett(Form): 
    preis_mehrbettz = MyFloatField('Preis pro Person', validators=[DataRequired(message="Geben Sie an wie teuer eine Nacht pro Person ist")]) 

class EditZimmerForm_Wohnung(Form): 
    preis_wohnungz = MyFloatField('Preis pro Person', validators=[DataRequired(message="Geben Sie an wie teuer eine Nacht pro Person ist")]) 

EDIT

これらのフォームの唯一の違いは、それが動作する最初のものが値を持たない、ということです。ユーザーが値を入力します。

編集がうまくいかないフォームは編集用です。それはすでに値があることを意味します。

+0

あなたのコードはprocess_formdata関数に入っていますか? – Hannu

+0

はいそれは正しい値を印刷することさえ入力します – Roman

答えて

0

クラスMyFloatFieldはまだFloatFieldです。コンマを含む文字列は有効な浮動小数点ではないため、エラーが発生します。

代わりに通常のStringFieldを使用し、入力が要件を満たしていることを確認するためにカスタムバリデーターを使用することをお勧めします。このようなものforms.py

def currency(form, field): 
    try: 
     Decimal(field.data) 
    except: 
     raise StopValidation('Value must be in decimal format') 
    if Decimal(field.data) < 0: 
     raise StopValidation('Value must be greater than zero') 

class ZimmerForm(Form): 
    preis = StringField('Preis pro Person', [currency, Optional()]) 
関連する問題