Aula 51 – Loja Online – Django – Total do Pedido
Aula 51 – Loja Online – Django – Total do Pedido
Voltar para página principal do blog
Todas as aulas desse curso
Aula 50 Aula 52
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
https://digitalinnovation.one/
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
Toti:
https://www.youtube.com/channel/UCUEtjLuDpcOvR3mIUr-viOA
Backing track / Play-along:
https://www.youtube.com/channel/UCT3TryVMqTqYBjf5g5WAHfA
Código Fluente
https://www.youtube.com/channel/UCgn-O-88XBAwdG9gUWkkb0w
Putz!
https://www.youtube.com/channel/UCZXop2-CECwyFYmHbhnAkAw
Aula 51 – Loja Online – Django – Total do Pedido
Na verdade o cálculo já está sendo efetuado em parte no carrinho, o que precisamos é uma forma de quando o carrinho for salvo, salvar o total no Order.
Não podemos importar o Order no models.py do Cart, porque já estamos importando o Cart no models do Order.
Isso geraria um ciclo reverso sem fim.
Então o que vamos fazer é: no models.py do Orders, importar o Model signals post_save.
O módulo Model signals define um conjunto de sinais enviados pelo modelo.
Seguindo
Vamos criar uma função chamada post_save_cart_total() que vai receber uma instância de Cart em cart_obj.
A partir da instância do Cart, pegamos o total daquele Cart instanciado e a função update_total() faz a soma do total que recebeu da instância do Cart e soma com shipping_total.
O shipping_total você pode pensar em alguma taxa a mais, além do que foi calculado no carrinho, no caso aqui, a gente definiu um valor padrão de 5.99.
O método update_total() é chamado quando o Cart muda e quando o Order é criado pela primeira vez.
Então, toda vez que o carrinho for alterado e salvo, o update_total() do Order é chamado.
A post_save_cart_total() só executa quando o Order ainda não tiver sido criado.
E a post_save_order() quando o Order já tiver sido criado.
Lembrando que o sinal pre_save é enviado antes que um modelo seja salvo e o pos_save o inverso.
from django.db import models
from django.db.models.signals import pre_save, post_save
from carts.models import Cart
from e_commerce.utils import unique_order_id_generator
ORDER_STATUS_CHOICES = (
('created', 'Criado'),
('paid', 'Pago'),
('shipped', 'Enviado'),
('refunded', 'Devolvido'),
)
class Order(models.Model):
order_id = models.CharField(max_length = 120, blank = True)
# billing_profile = ?
# shipping_address = ?
# billing_address
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, null = True)
status = models.CharField(max_length = 120, default = 'created', choices = ORDER_STATUS_CHOICES )
shipping_total = models.DecimalField(default = 5.99, max_digits = 100, decimal_places = 2)
total = models.DecimalField(default = 0.00, max_digits = 100, decimal_places = 2)
def __str__(self):
return self.order_id
def update_total(self):
cart_total = self.cart.total
shipping_total = self.shipping_total
new_total = cart_total + shipping_total
self.total = new_total
self.save()
return new_total
def pre_save_create_order_id(sender, instance, *args, **kwargs):
if not instance.order_id:
instance.order_id = unique_order_id_generator(instance)
pre_save.connect(pre_save_create_order_id, sender = Order)
def post_save_cart_total(sender, instance, created, *args, **kwargs):
if not created:
cart_obj = instance
cart_total = cart_obj.total
cart_id = cart_obj.id
qs = Order.objects.filter(cart__id=cart_id)
if qs.count() == 1:
order_obj = qs.first()
order_obj.update_total()
post_save.connect(post_save_cart_total, sender=Cart)
def post_save_order(sender, instance, created, *args, **kwargs):
print("Executando")
if created:
print("Atualizando")
instance.update_total()
post_save.connect(post_save_order, sender=Order)
Agora acesse http://127.0.0.1:8000/admin
Clique em Orders no painel admin e ligue um Order a um carrinho e salve.
Altere o carrinho associado ao Order, adicione itens, depois volte no Order e veja se tá calculando certinho, inclusive se tá adicionando o 5.99 do shipping_total ao total do Order.