Я получаю ошибку [<class 'decimal.ConversionSyntax'>] в моей корзине, как это исправить?

При добавлении товара в корзину возникает ошибка InvalidOperation at /cart/ [<class 'decimal.ConversionSyntax'>].

Мой код:

cart..py ...............................

from decimal import Decimal
from django.conf import settings
from TeaYardApp.models import Products


class Cart(object):

    def __init__(self, request):
        self.session = request.session
        cart = self.session.get(settings.CART_SESSION_ID)
        if not cart:
            cart = self.session[settings.CART_SESSION_ID] = {}
        self.cart = cart

    def __iter__(self):
        product_ids = self.cart.keys()
        # получаем товары и добавляем их в корзину
        product = Products.objects.filter(id__in=product_ids)

        cart = self.cart.copy()
        for product in product:
            cart[str(product.id)]['product'] = product

        for item in cart.values():
            item['price'] = Decimal(item['price'])
            item['total_price'] = item['price'] * item['quantity']
            yield item

    def __len__(self):
        return sum(item['quantity'] for item in self.cart.values())

    def add(self, product, quantity=1, update_quantity=False):
        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = {'quantity': 0,
                                     'price': str(product.price)}
        if update_quantity:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity
        self.save()

    def save(self):
        self.session.modified = True

    def remove(self, product):
        product_id = str(product.id)
        if product_id in self.cart:
            del self.cart[product_id]
            self.save()

    def get_total_price(self):
        return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())

    def clear(self):
        del self.session[settings.CART_SESSION_ID]
        self.save()

Форма для добавления товаров в корзину, forms.py ..................................

from django import forms

PRODUCT_QUANTITY_CHOICES = [(i, str(i)) for i in range(25, 200+1, 25)]


class CartAddProductForm(forms.Form):
    quantity = forms.TypedChoiceField(
        choices=PRODUCT_QUANTITY_CHOICES,
        coerce=int)
    update = forms.BooleanField(required=False,
                                initial=False,
                                widget=forms.HiddenInput)

Я не знаю, как исправить эту ошибку, помогите, пожалуйста. ....................................

Traceback:

Traceback (most recent call last):
  File "C:\my_projects\TeaYard\venv\lib\site-packages\django\core\handlers\exception.py"
, line 55, in inner
    response = get_response(request)
  File "C:\my_projects\TeaYard\venv\lib\site-packages\django\core\handlers\base.py", lin
e 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\my_projects\TeaYard\App\cart\views.py", line 30, in cart_detail
    for item in cart:
  File "C:\my_projects\TeaYard\App\cart\cart.py", line 28, in __iter__
    item['price'] = Decimal(item['price'])
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

Вы передаете неверное значение в функцию Decimal. Если вы передадите в эту функцию пустую строку (""), то получите такую ошибку. Вам следует проверить, какое значение вы туда передаете.

Вы можете попробовать это в вашей get_total_price функции Cart модели:

def get_total_price(self):
    price = item['price'] if item['price'] else 0
    return sum(Decimal(price) * item['quantity'] for item in self.cart.values())

Если проблема такая же, как и 'quantity', то решите ее тем же способом.

Ошибка возникает в этой строке:

item['price'] = Decimal(item['price'])

Это происходит потому, что item['price'] не является числовым. Например, эта ошибка может произойти, если значение item['price'] равно '' или abc.

Если вы используете Django Rest Framework, то сериализаторы являются лучшим способом проверки входных данных.

Если вы хотите просто избежать ошибки, самым простым способом будет проверка каждый раз значения item['price']:

# convert to string first (to be able call isnumeric method)
price = str(item['price'])
# check if price string is numeric
if price.isnumeric()
  price = Decimal(price)
else:
  # handle bad value (raise error or whatever depending on your logic)
  raise ValueError('price must be numeric value')
Вернуться на верх