2009-06-07 5 views
0

Je suis en train d'essayer quelques calculs simples dans une méthode de nettoyage après la validation (en crachant essentiellement une conversion en euro du prix du produit uk récupéré à la volée). Je continue d'obtenir un TypeError.Erreurs dans les Calcs décimaux dans la méthode def clean?

erreur complète se lit comme suit:

Impossible de convertir { 'produit':, 'facture': 'order_discount': décimal ("0,00"), 'order_price': {...}, 'order_adjust': Aucun, 'order_value': Aucun, 'DELETE': False, 'id': 92, 'quantity': 8} en Decimal

donc je suppose que django passe à travers toute la forme clean_data à la méthode Decimal. Je ne sais pas où je vais mal - le code, je travaille avec est:

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 

Si la facture est de type 2 (une facture euro), le système devrait saisir le dernier taux de change et l'appliquer à le prix de la livre britannique correspondante s'est ressaisi pour obtenir le résultat de l'euro.

La conversion décimale doit-elle être un problème dans la méthode def clean?

Merci

+0

Je ne comprends pas comment le code que vous avez publié arrive à la décimale: il soulève inconditionnellement une exception juste avant que/elif. Vérifiez et corrigez les indentations? –

+0

Aussi, une fois que vous avez édité: pourquoi obtenez-vous "order_price" à partir de clean_data deux fois, une fois avec un get à assigner à une variable que vous ignorez, et une fois avec une indexation []? Et pourquoi renvoyez-vous un Decimal dans certains cas et un dict dans d'autres? C'est du code assez déroutant! –

Répondre

0

Je vais supposer que vous avez fait une erreur d'indentation sur le collage et les lignes de if data['invoice_type'] == 1: devrait en fait être en retrait d'un niveau précédent - sinon, comme le dit Alex, le code ne sera jamais à la conversion décimale. Il y a plusieurs autres problèmes avec ce code, mais le plus important est que la dernière ligne renvoie l'ensemble du dictionnaire clean_data, plutôt que la valeur de ce champ particulier - je suppose que c'est la cause de l'erreur que vous voyez.

Autre que cela, il y a une grosse erreur où vous calculez calc en multipliant cost_price_gross par exchange. Ici exchange est une instance de EuroExchangeRate, plutôt qu'un nombre, donc ce calcul ne fonctionnera pas.

Questions connexes