2009-06-07 4 views
0

Ich versuche ein paar einfache Berechnungen in einer Def-Clean-Methode nach Validierung (im Grunde spuckt eine Euro-Konvertierung von abgerufenen uk Produktpreis im laufenden Betrieb). Ich bekomme immer einen TypeError.Fehler in Dezimalberechnungen innerhalb der Def-Clean-Methode?

Voll Fehler lautet:

Kann nicht { 'Produkt' konvertieren: 'Rechnung': 'order_discount': Dezimal ("0.00"), 'order_price': {...}, 'order_adjust': Keine, 'LÖSCHEN': Keine, 'LÖSCHEN': Falsch, 'ID': 92, 'Menge': 8} bis Dezimal

also denke ich, dass Django die gesamte gereinigte_Datenform zur Dezimalmethode durchläuft. Nicht sicher, wohin ich gehe falsch - der Code ich arbeite mit ist:

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 

Wenn die Rechnung vom Typ 2 (a Euro Rechnung), dann sollte dem System den aktuellen Wechselkurs packen und dann Anwendung, wenn auf Der entsprechende UK-Pfund-Kurs wurde durchgezogen, um das Euro-Ergebnis zu erhalten.

Sollte eine Dezimalumwandlung ein Problem innerhalb der Def Clean-Methode sein?

Dank

+0

Ich verstehe nicht, wie der Code, den Sie gepostet haben, jemals an das Dezimalsystem kommt: Es erzeugt bedingungslos eine Ausnahme direkt vor dem if/elif. Überprüfen und korrigieren Sie den Eindruck pls? –

+0

Auch, wenn Sie edit: Warum erhalten Sie zweimal "Order_Price" aus cleaned_data, einmal mit einem Get zu einer Variablen zuweisen, die Sie dann ignorieren, und einmal mit einer Indexierung []? Und warum gibst du in einigen Fällen ein Dezimalsystem und in anderen ein Diktat zurück? Es ist ziemlich verwirrender Code! –

Antwort

0

Ich werde Sie davon ausgehen, haben eine Vertiefung Fehler auf Einfügen gemacht, und die Linien von if data['invoice_type'] == 1: sollte eigentlich eine Ebene zurück eingezogen werden - sonst, wie Alex sagt, wird der Code nie bekommen die Dezimalumwandlung.

Es gibt mehrere andere Probleme mit diesem Code, aber der größte ist, dass die letzte Zeile das gesamte cleaned_data-Wörterbuch zurückgibt, anstatt den Wert dieses bestimmten Feldes - ich vermute, dass dies die Ursache des Fehlers ist, den Sie sehen.

Ansonsten gibt es einen großen Fehler, bei dem Sie calc berechnen, indem Sie cost_price_gross mit exchange multiplizieren. Hier ist exchange eine Instanz von EuroExchangeRate und nicht eine Zahl, daher funktioniert diese Berechnung nicht.

Verwandte Themen