Dentro de este cuarto y último tutorial se cubrirán los siguientes puntos:
Procesar nuevo pedido.
Mostrar histórico de pedidos.
Filtrar productos por categoría.
1. Procesar un nuevo pedido
- Dentro del paquete “models” de la aplicación
store
, crea un archivo Python: “pedido.py” y agrega la siguiente definición para el modelo:
from django.db import models
from django.contrib.auth.models import User
from .producto import Producto class Pedido(models.Model): usuario = models.ForeignKey(User, on_delete=models.CASCADE) producto = models.ForeignKey(Producto, on_delete=models.CASCADE) cantidad = models.PositiveIntegerField(default=1) total = models.DecimalField(max_digits=12, decimal_places=2) fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ult_act = models.DateTimeField(auto_now=True) def __str__(self) -> str: return f'{self.id}' class Meta: db_table = 'st_pedidos' verbose_name = 'Pedido' verbose_name_plural = 'Pedidos'`
El modelo Pedido se utilizará para registrar los nuevos pedidos.
- A continuación, debemos crear la “URL” a través de la cual se procesará el registro de cada pedido. Agrega el siguiente código a tu archivo urls.py de la aplicación “store”:
urlpatterns = [ # Otras rutas path('pedidos/', views.crear_pedido, name='crear_pedido')
]
- Una vez que la ruta esté creada vamos a asociarla con su función de vista correspondiente, para ello crearemos la función
crear_pedido
en el archivo views.py de la aplicación “store”:
def crear_pedido(request): try: datos_pedido = json.loads(request.body) producto_id = int(datos_pedido.get('producto_id')) cantidad = int(datos_pedido.get('cantidad')) producto = Producto.objects.get(pk=producto_id) nuevo_pedido = Pedido( usuario=request.user, producto=producto, cantidad=cantidad, total=cantidad*producto.precio) nuevo_pedido.save() return JsonResponse({'success': True, 'message': f'Se registró el pedido exitosamente. Pedido # {nuevo_pedido.id}'}, status=200) except Exception as ex: return JsonResponse({'success': False, 'message': str(ex)}, status=500)
- Posteriormente realizaremos la petición http vía ajax que se encargará de consumir la ruta de creación de pedido al momento que el usuario desee ingresar un nuevo pedido. Para ello, vamos a crear un nuevo archivo estático de javascript dentro de la carpeta
static/js
, el archivo podría llamarsepedido.js
.
Dentro del archivo, procedemos a registrar la siguiente función:
function crearPedido = (producto_id, cantidad, csrf_token) => { const jsonData= { producto_id: producto_id, cantidad: cantidad } axios.post('/pedidos/', jsonData, { headers: { 'X-CSRFToken': csrfToken } }) .then(response => { alert(response.data.message); }) .catch(error => { if (error.response) { alert(error.response.data.message); }else { alert(error.message); } });