Aula 52 – Loja Online – Django – Checkout View
Aula 52 – Loja Online – Django – Checkout View
Voltar para página principal do blog
Todas as aulas desse curso
Aula 51 Aula 53
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 52 – Loja Online – Django – Checkout View
Apesar do Checkout ter haver com o Order, no nosso projeto, vai fazer mais sentido colocar o Checkout View no Cart.
No Cart temos o Cart Home, Cart Update e agora vamos ter o Checkout home.
E importar o modelo Order no Cart, porque vamos usar ele dentro da views do Cart.
Vamos abrir então o views.py do Cart e definir o método de checkout_home().
e_commerce/carts/views.py
from django.shortcuts import render, redirect
from orders.models import Order
from products.models import Product
from .models import Cart
def cart_home(request):
cart_obj, new_obj = Cart.objects.new_or_get(request)
return render(request, "carts/home.html", {"cart": cart_obj})
def cart_update(request):
print(request.POST)
product_id = request.POST.get('product_id')
if product_id is not None:
try:
product_obj = Product.objects.get(id = product_id)
except Product.DoesNotExist:
print("Mostrar mensagem ao usuário, esse produto acabou!")
return redirect("cart:home")
cart_obj, new_obj = Cart.objects.new_or_get(request)
if product_obj in cart_obj.products.all():
cart_obj.products.remove(product_obj)
else:
cart_obj.products.add(product_obj)
request.session['cart_items'] = cart_obj.products.count()
return redirect("cart:home")
def checkout_home(request):
#aqui a gente pega o carrinho
cart_obj, cart_created= Cart.objects.new_or_get(request)
order_obj = None
#se o carrinho acabou de ser criado, ele tá zerado
#ou se o carrinho já existir mas não tiver nada dentro
if cart_created or cart_obj.products.count() == 0:
return redirect("cart:home")
#aqui a order associada ao carrinho
else:
order_obj, new_order_obj = Order.objects.get_or_create(cart = cart_obj)
return render(request, "carts/checkout.html", {"object": order_obj})
Agora no e_commerce/carts/urls.py vamos importar o método checkout_home() que acabamos de criar acima e a rota checkout.
e_commerce/carts/urls.py
from django.urls import path
app_name = "carts"
from .views import (
cart_home,
checkout_home,
cart_update,
)
urlpatterns = [
path('', cart_home, name='home'),
path('checkout/', checkout_home, name='checkout'),
path('update/', cart_update, name='update')
]
Agora crie o html da view do checkout.
e_commerce/carts/templates/carts/checkout.html
{% extends "base.html" %}
{% block content %}
<h1>Checkout</h1>
<p>Total do carrinho: {{ object.cart.total }}</p>
<p>Frete: {{ object.shipping_total }}</p>
<p>total: {{ object.total }}</p>
{% endblock %}
E no home do Cart vamos colocar um botão de checkout.
e_commerce/carts/templates/carts/home.html
{% extends "base.html" %}
{% block content %}
<h1>Cart</h1>
{% if cart.products.exists %}
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Nome</th>
<th>Preço/th>
</tr>
</thead>
<tbody>
{% for product in cart.products.all %}
<tr>
<th scope="row">{{ forloop.counter }}</th>
<td>
<a href='{{ product.get_absolute_url }}'>{{ product.title }}</a>
{% include 'products/snippets/update-cart.html' with product=product cart=cart in_cart=True %}
</td>
<td>{{ product.price }}</td>
</tr>
{% endfor %}
<tr>
<td colspan="2"></td>
<td><b>Subtotal</b> {{ cart.subtotal }}</td>
</tr>
<tr>
<td colspan="2"></td>
<td><b>Total</b> {{ cart.total }}</td>
</tr>
<tr>
<td colspan="2"></td>
<td><a class='btn btn-lg btn-success' href='{% url "cart:checkout" %}'>Conferir compra</a></td>
</tr>
</tbody>
</table>
{% else %}
<p class='lead'>Carrinho vazio</p>
{% endif %}
{% endblock %}
Agora acesse http://127.0.0.1:8000/admin
Na próxima a gente vai ver o módulo math com decimais e floats.