Я получаю ошибку [<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')