Aula 42 – Loja Online – Django – Gerência do carrinho – Cart Manager
Aula 42 – Loja Online – Django – Gerência do carrinho – Cart Manager

Gerência do carrinho
Voltar para página principal do blog
Todas as aulas desse curso
Aula 41 Aula 43
Se gostarem do conteúdo dêem um joinha
na página do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no https://github.com/toticavalcanti.
Código final da aula:
https://github.com/toticavalcanti
Aula 42 – Loja Online – Django – Gerência do carrinho – Cart Manager
Vamos construir a classe CartManager, resposável por gerenciar o carrinho.
Gerentes
Classe Manager
Um Manager é a interface por meio da qual as operações de consulta ao banco de dados são fornecidas aos modelos Django.
Por padrão, o Django adiciona um Manager com o nome de objetos para cada classe de modelo Django.
Mas, se quiser usar objetos como um nome de campo ou se quiser usar um nome diferente de objetos para o gerenciador, você pode renomeá-lo por modelo.
Para renomear o gerenciador de uma determinada classe, defina um atributo de classe do tipo models.Manager().
E é isso que faremos no nosso models.py do carts.
A classe CartManager é criada recebendo como parâmetro o models.Manager, porque a gente tá extendendo o models.Manager na CartManager.
Em seguida definimos o método new_or_get() que recebe a instância de si mesmo ( self ) em memória e a request.
A linha:
cart_id = request.session.get(“cart_id”, None)
Essa linha pega o cart_id caso exista, senão, retorna None.
Em seguida é feita uma consulta filtrando pelo id do carrinho guardando o resultado da consulta em qs.
qs = self.get_queryset().filter(id = cart_id)
Como estamos consultando pelo id do carrinho, o retorno será um e somente um carrinho, caso ele exista.
A linha do if:
if qs.count == 1:
Testa pra ver se o carrinho foi retornado.
Em seguida, temos uma variável booleana chamada new_obj.
Ela é usada tanto dentro do if, como também dentro do else.
Ela é só pra indicar se um novo objeto carrinho foi criado ou não.
Então, se entrou no if é porque foi retornado o carrinho com o id pego pelo session.get().
Aí então não precisamos criar um outro objeto carrinho, por isso:
new_obj = False
Se cair no else, é o porque o session.get() não retornou um carrinho, então é preciso criar um:
new_obj = True
Seguindo dentro do if, como o carrinho foi retornado pelo session.get(), ou seja, já existe, pegamos esse carrinho e atribuímos a variável cart_obj.
cart_obj = qs.first()
Temos agora um if interno.
if request.user.is_authenticated and cart_obj.user is None:
cart_obj.user = request.user
cart_obj.save()
Esse trecho acima testa se o usuário está autenticado e se o carrinho não está associado a ele, se isso tudo for verdade, o carrinho é associado a esse usuário autenticado e a associação é salva no banco.
Esse if interno não tem else.
Else
A parte do else é quando o carrinho não existe, então um carrinho é criado e associado ao usuário logado.
cart_obj = Cart.objects.new(user=request.user)
O new, falaremos mais abaixo.
E como foi criado um novo objeto carrinho, colocamos new_obj como True:
new_obj = True
Em seguida é atribuido a chave cart_id do dicionário session, o id do carrinho que acabou de ser criado:
request.session[‘cart_id’] = cart_obj.id
E por fim é retornado o cart_obj, que é o carrinho, e o new_obj, a variável booleana, que nos informa se o carrinho teve que ser criado ou não.
return cart_obj, new_obj
Agora o método new
def new(self, user=None):
user_obj = None
if user is not None:
if user.is_authenticated:
user_obj = user
return self.model.objects.create(user=user_obj)
Nesse método, verificamos se o usuário existe e se está autenticado, se isso for verdade, atribuimos ao usuário que chegou a esse método, a variável user_obj.
No final, é retornado o objeto criado associado ao usuário se ele existir ou None caso contrário.
django_ecommerce/carts/models.py
from django.conf import settings
from django.db import models
from products.models import Product
User = settings.AUTH_USER_MODEL
class CartManager(models.Manager):
def new_or_get(self, request):
cart_id = request.session.get("cart_id", None)
qs = self.get_queryset().filter(id = cart_id)
if qs.count() == 1:
new_obj = False
cart_obj = qs.first()
if request.user.is_authenticate and cart_obj.user is None:
cart_obj.user = request.user
cart_obj.save()
else:
cart_obj = Cart.objects.new(user = request.user)
new_obj = True
request.session['cart_id'] = cart_obj.id
return cart_obj, new_obj
def new(self, user = None):
user_obj = None
if user is not None:
if user.is_authenticate:
user_obj = user
return self.model.objects.create(user = user_obj)
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null = True, blank = True)
products = models.ManyToManyField(Product, blank = True)
total = models.DecimalField(default = 0.00, max_digits=100, decimal_places = 2)
updated = models.DateTimeField(auto_now = True)
timestamp = models.DateTimeField(auto_now_add = True)
objects = CartManager()
def __str__(self):
return str(self.id)
Views
Temos o import do model Cart.
from .models import Cart
dentro do cart_home() chamamos o método new_or_get() do gerente de carrinho que criamos e atribuimos a variável cart_obj.
cart_obj = Cart.objects.new_or_get(request)
Veja os códigos completos.
django_ecommerce/carts/views.py
from django.shortcuts import render
from .models import Cart
def cart_home(request):
cart_obj = Cart.objects.new_or_get(request)
return render(request, "carts/home.html", {})
Certifique-se que o seu servidor está rodando e acesse a página de admin.
Veja que temos alguns carrinhos criados.
Faça o logout na página de admin e como usuário também, em seguida dê um refresh na página http://127.0.0.1:8000/cart.
Entre na página na http://127.0.0.1:8000/admin e acesse carts, veja que ele criou um carrinho, mas não associou a nenhum usuário, porque não tinha nenhum usuário logado na sessão.
Agora faça o login como usuário comum e acesse novamente a página http://127.0.0.1:8000/cart.
Agora na admin acesse carts e veja que foi criado um novo carrinho associado ao usuário logado.
No meu ta dando erro
AttributeError at /cart/
‘User’ object has no attribute ‘is_authenticate’
faço exatamento como ta ai no post
Hiaguim,
O erro diz que o User não tem o attributo is_authenticate
Você colocou essa linha no models.py?
User = settings.AUTH_USER_MODEL
Outra coisa que voc pode tentar é o seguinte, dá uma comparada no meu carts/models.py e o seu, vê se tem algo diferente.
Link:
https://github.com/toticavalcanti/django_ecommerce/blob/cart-manager/carts/models.py
Ou ainda, você pode fazer é clonar essa branch:
https://github.com/toticavalcanti/django_ecommerce/tree/cart-manager
Tentar rodar e vê se dá o msm erro.
Porque sem ver seu código, fica difícil identificar o que tá rolando.
Colega, use essas alterações:
models.manager >> alterado para models.Manager.
qs.count == 1 >> alterado para qs.count() == 1.
request.user.is_authenticate >> alterado para request.user.is_authenticated.
Obrigado gessecazuza, corrijido.
\o/ e bons estudos.