Добрый день! Подскажите возможно ли в сесии хранить несколько переменных? возникла такая ситуация я храню в сесии корзину магазина, ну и захотел там же хранить еще wish_list(чтоб модели не плодить) в settings.py прописал две переменные
CART_SESSION_ID = 'cart'
WISH_SESSION_ID = 'wish_list'
вроде бы все нормально при инициализации создаются 2 пустых словаря все с ключами соответсвенно проект работает когда 2 ключа пустые или оба ключа заполненные а вот когда один из ключей пуст тогда крашится с ошибкой Decimal('400.00') is not JSON serializable хотя ошибка прям наверно не имеет отношения потому, что когда запоняется второй ключ ошибки нет!
может есть какие мысли?
from decimal import Decimal
from django.conf import settings
from shop.models import Product
class Cart(object):
def __init__(self, request):
# Initial cart for users
self.session = request.session
cart = self.session.get(settings.CART_SESSION_ID)
if not cart:
# Save cart user in to session
cart = self.session[settings.CART_SESSION_ID] = {}
self.cart = cart
def add(self, product, quantity=1):
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 1, 'price': str(product.price)}
elif quantity == '':
quantity = 1
self.cart[product_id]['quantity'] = quantity
else:
self.cart[product_id]['quantity'] = int(quantity)
self.save()
# save date in session
def save(self):
self.session[settings.CART_SESSION_ID] = self.cart
# in session modified
self.session.modified = True
# delete product in cart
def remove(self, product):
product_id = str(product.id)
if product_id in self.cart:
del self.cart[product_id]
self.save()
# iteration for product
def __iter__(self):
product_ids = self.cart.keys()
products = Product.objects.filter(id__in=product_ids)
for product in products:
self.cart[str(product.id)]['product'] = product
for item in self.cart.values():
item['price'] = Decimal(item['price'])
item['quantity'] = int(item['quantity'])
item['total_price'] = item['price'] * item['quantity']
yield item
def __len__(self):
return sum(int(item['quantity']) for item in self.cart.values())
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.session.modified = True
собственно корзина
class WishList(object):
def __init__(self, request):
# Initial wish_list for users
self.session = request.session
wish_list = self.session.get(settings.WISH_SESSION_ID)
if not wish_list:
# Save wish_list user in to session
wish_list = self.session[settings.WISH_SESSION_ID] = {}
self.wish_list = wish_list
def add(self, product):
product_id = str(product.id)
if product_id not in self.wish_list:
self.wish_list[product_id] = {'price': str(product.price)}
self.save()
# save date in session
def save(self):
self.session[settings.WISH_SESSION_ID] = self.wish_list
# in session modified
self.session.modified = True
# delete product in cart
def remove(self, product):
product_id = str(product.id)
if product_id in self.wish_list:
del self.wish_list[product_id]
self.save()
def __iter__(self):
product_ids = self.wish_list.keys()
products = Product.objects.filter(id__in=product_ids)
for product in products:
self.wish_list[str(product.id)]['product'] = product
for item in self.wish_list.values():
item['price'] = Decimal(item['price'])
yield item
def __len__(self):
return len(self.wish_list)
и список желаний
def wish_list_add(request, product_id):
wish_list = WishList(request)
product = get_object_or_404(Product, id=product_id)
wish_list.add(product=product)
return redirect('cart:wish_list_detail')
корзина примерно такая-же