Aula 42 – Loja Online – Django – Gerência do carrinho – Cart Manager
Aula 42 – Loja Online – Django – Gerência do carrinho – Cart Manager
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.