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

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á extendendomodels.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!

Aula 41               Aula 43

Todas as aulas desse curso

Voltar para página principal do blog

Código final da aula:

https://github.com/toticavalcanti

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:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. 😉

About The Author
-

4 Comentários

  • hiaguim
    Reply

    No meu ta dando erro
    AttributeError at /cart/
    ‘User’ object has no attribute ‘is_authenticate’

    faço exatamento como ta ai no post

  • gessecazuza
    Reply

    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.

    • toticavalcanti
      Reply

      Obrigado gessecazuza, corrijido.
      \o/ e bons estudos.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>