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