Aula 42 - Loja Online - Django - Gerência do carrinho - Cart Manager
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:
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
Código final da aula:
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.
É isso pessoal, nos vemos na próxima!
Código final da aula:
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)