私は、バリデーションの後に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つのレベルにインデントされなければならないと仮定するつもりだ
おかげ
投稿したコードがどのようにDecimalに到達するのか分かりません。/ elifの場合、その前に無条件に例外が発生します。インデントplsを確認して修正しますか? –
また、いったん編集すると、なぜ、「order_price」がcleaned_dataから2回、1回はgetで変数に代入されて無視され、[]で1回インデックス付けされますか?そしてなぜあなたはDecimalをいくつかのケースで返し、他のものを返すのですか?それはかなり混乱するコードです! –