I need to sum the prices of all shopping cart items to appear on the cart page, follow the link in my application on Heroku - link
I wanted some help to do this in the best way. Follow the models and my View just below.
Models
Add Item Shopping Cart
class CartItemManager(models.Manager):
def add_item(self, cart_key, produto):
if self.filter(cart_key=cart_key, produto=produto).exists():
created = False
cart_item = self.get(cart_key=cart_key, produto=produto)
cart_item.quantidade = cart_item.quantidade + 1
cart_item.save()
else:
created = True
cart_item = CartItem.objects.create(cart_key=cart_key, produto=produto, preco_p=produto.preco_p)
return cart_item, created
#Item do Carrinho de compras
class CartItem(models.Model):
cart_key = models.CharField('Chave do Carrinho', max_length=40, db_index=True)
produto = models.ForeignKey('catalogo.Produto', verbose_name='Produto')
quantidade = models.PositiveIntegerField('Quantidade', default=1)
preco_p = models.DecimalField('Preço', decimal_places=2, max_digits=8)
total_p = models.DecimalField('Total', decimal_places=2, max_digits=8, null=True, blank=True)
objects = CartItemManager()
class Meta:
verbose_name = 'Item do Carrinho'
verbose_name_plural = 'Itens dos Carrinhos'
unique_together = (('cart_key', 'produto'),)
def __str__(self):
return '{} [{}]'.format(self.produto, self.quantidade)
def post_save_cart_item(instance, **kwargs):
if instance.quantidade < 1:
instance.delete()
models.signals.post_save.connect(
post_save_cart_item, sender=CartItem, dispatch_uid='post_save_cart_item'
)
Views
class CreateCartItemView(View):
def get(self, request, *args, **kwargs):
produto = get_object_or_404(Produto, slug=self.kwargs['slug'])
if self.request.session.session_key is None:
self.request.session.save()
cart_item, created = CartItem.objects.add_item(
self.request.session.session_key, produto
)
if created:
message = 'Produto adicionado com sucesso'
else:
message = 'Produto atualizado com sucesso'
if request.is_ajax():
return HttpResponse(
json.dumps({'message': message}),
content_type='application/javascript'
)
total = CartItem.objects.total()
messages.success(request, message)
return redirect('checkout:cart_item')
create_cartitem = CreateCartItemView.as_view()
class CartItemView(TemplateView):
template_name = 'checkout/cart.html'
def get_formset(self, clear=False):
CartItemFormSet = modelformset_factory(
CartItem, fields=('quantidade',), can_delete=True, extra=0
)
session_key = self.request.session.session_key
if session_key:
if clear:
formset = CartItemFormSet(
queryset=CartItem.objects.filter(cart_key=session_key)
)
else:
formset = CartItemFormSet(
queryset=CartItem.objects.filter(cart_key=session_key),
data=self.request.POST or None
)
else:
formset = CartItemFormSet(queryset=CartItem.objects.none())
return formset
def get_context_data(self, **kwargs):
context = super(CartItemView, self).get_context_data(**kwargs)
context['formset'] = self.get_formset()
return context
def post(self, request, *args, **kwargs):
formset = self.get_formset()
context = self.get_context_data(**kwargs)
if formset.is_valid():
formset.save()
messages.success(request, 'Carrinho atualizado com sucesso')
context['formset'] = self.get_formset(clear=True)
return self.render_to_response(context)
cart_item = CartItemView.as_view()