2009-06-07 6 views
0

私は、バリデーションの後にdef cleanメソッドで簡単な計算を試みています(基本的に、検索された英国製品価格のユーロ変換を即座に吐き​​出す)。私はTypeErrorを得続けます。def cleanメソッド内のDecimal Calcのエラー?

フル・エラーが読み込み: '請求書': 'order_discount':10進数( "0.00")、 'order_price':{...} 'order_adjust'

は{ '製品' に変換できません。 'order_value':None、 'DELETE':False、 'id':92、 'quantity':8} Decimalへ

だから、djangoはcleaned_dataフォーム全体をDecimalメソッドに渡しているようです。私は間違っているつもりだ場所がわからない - 私が働いているコードを次のとおりです。

def clean_order_price(self): 
    cleaned_data = self.cleaned_data 
    data = self.data 
    order_price = cleaned_data.get("order_price") 
    if not order_price: 
     try: 
      existing_price = ProductCostPrice.objects.get(supplier=data['supplier'], product_id=cleaned_data['product'], is_latest=True) 
     except ProductCostPrice.DoesNotExist: 
      existing_price = None 
     if not existing_price: 
      raise forms.ValidationError('No match found, please enter new price') 
     else: 
      if data['invoice_type'] == 1: 
       return existing_price.cost_price_gross 
      elif data['invoice_type'] == 2: 
       exchange = EuroExchangeRate.objects.latest('exchange_date') 
       calc = exchange.exchange_rate * float(existing_price.cost_price_gross) 
       calc = Decimal(str(calc)) 
       return calc 

    return cleaned_data 

請求書が2型(ユーロインボイス)である場合、システムは、最新の為替レートを取得し、にそれを適用する必要があります一致する英国ポンド価格はユーロの結果を得るために引っ張られた。

def cleanメソッド内で小数変換を実行する必要がありますか?それ以外の場合は、アレックスが言うように、コードはに到達することはありません - 私はあなたが貼り付け上のインデントエラーを作った、とif data['invoice_type'] == 1:からのラインが実際に戻って1つのレベルにインデントされなければならないと仮定するつもりだ

おかげ

+0

投稿したコードがどのようにDecimalに到達するのか分かりません。/ elifの場合、その前に無条件に例外が発生します。インデントplsを確認して修正しますか? –

+0

また、いったん編集すると、なぜ、「order_price」がcleaned_dataから2回、1回はgetで変数に代入されて無視され、[]で1回インデックス付けされますか?そしてなぜあなたはDecimalをいくつかのケースで返し、他のものを返すのですか?それはかなり混乱するコードです! –

答えて

0

小数変換

このコードには他にも複数の問題がありますが、最大のものは、この特定のフィールドの値ではなく、cleaned_dataディクショナリ全体を返します。これが原因で発生したと考えられます。

それ以外

、あなたがexchangeによってcost_price_grossを乗じてcalcを計算に大きな誤差があります。ここではexchangeは数値ではなくEuroExchangeRateのインスタンスなので、この計算は機能しません。

関連する問題