Django Guia Rapida II - App y CRUD en Admin

Esta entrada es continuacion de: Django Guia Rapida I - Crear proyecto web

Django trabaja un proyecto por apps, una app es como un modulo, un pequeño programa que puede ser auto suficiente para trabajar por si mismo o en conjunto con otros. Continuando con la idea de crear un sistema para el manejo de una muebleria ahora vamos a retomar el proyecto hecho en el post previo y crear las apps que compondran el proyecto asi como implementar las funciones CRUD (create, read, update y delete) de dichas apps en el lado del administrador.


He diseñado mi proyecto de muebleria dividiendolo en 4 apps. Que son las siguientes:
  • Empleados
  • Clientes
  • Productos
  • Ventas

Como he mencionado la idea es que cada app por si misma es un modulo, asi por ejemplo la app clientes es un modulo para manejar los registros de los clientes. Pero al mismo tiempo cada app puede trabajar con otras, la app clientes trabajara en conjunto con la app ventas y de hecho la app ventas trabajar dependiendo de la app clientes.

Ahora de esas 4 apps en el lado del area de administrador solo voy a crear 4, django nos ahorro algo de trabajo ya que al crear el proyecto por default se crean tres apps. Grupos, Users y Sites. Aprovechando eso vamos a considerar que users son los empleados y por lo tanto esa app esta hecha. En un proyecto real no seria posible ya que users solo nos maneja los campos de nombre, password y permisos (relacionandose con grupos) y en la realidad necesitariamos mas que eso (para meter por ejemplo datos como rfc, seguro social, sueldo, puesto, etc), pero para este ejemplo vamos a suponer que es suficiente con eso.


Empezamos, abrimos nuestra consola en el directorio de nuestro proyecto, el cual es:

c:/django/muebleria/muebleria>

Crearemos en primer lugar la app clientes, le llamare... clientes

Paso 1-
Ejecutamos el comando siguiente:

> python manage.py startapp clientes

En nuestra carpeta de proyecto se modifica la estructura, pues que se crea la carpeta del modulo clientes y queda asi:

/
|- manage.py
|-clientes
|- __init__.py
|- models.py
|- tests.py
|- views.py
|- muebleria
|- ... (archivos)

Paso 2-
Ahora vamos a crear el modelo de nuestra app abrimos el archivo siguiente:

/muebleria/clientes/models.py

Nuestro modelo para esta app constara de una entidad, llamada Cliente, sera un entidad sencilla ya que esto es para practicar y aprender, la definicion nos queda asi:

from django.db import models

class Cliente(models.Model):
id=models.AutoField(primary_key=True)
nombre=models.CharField(max_length=75)

def __unicode__(self):
return self.nombre

En lenguaje sql lo anterior es lo equivalente de:

create table(
id integer primary key auto_increment,
nombre varchar(75)
);

Solo que aqui la notacion de Django es de el modo mostrado, recomiendo que echen un vistazo a la documentacion de models como nota breve expongo algunos puntos esenciales sobre la forma de defidir entidades en Django:

  • Se declara el nombre del campo y el tipo como propiedad de models: nombre_campo=models.tipo_de_dato
  • Para declarar un campo clave de una entidad el tipo es: models.AutoField(primary_key=True)
  • Para declarar un campo cadena de texto: models.CharField(max_length=XX) donde XX es la longitud
  • Para declarar un campo entero: models.IntegerField()
  • Para declarar un campo real: models.DecimalField(max_digits=8, decimal_places=2) donde se especifican los digitos y digitos decimales
  • Para declarar un campo fecha: models.DateTimeField(auto_now=False, auto_now_add=False)

Esta parte del codigo:

def __unicode__(self):
return self.nombre

Le sirve a Django para saber como representar esta entidad como candena. Si han trabajado con objetos en java, digamos que es lo mismo que decirle que debe regresar cuando hay una llamada al metodo toString() de la entidad, asi si por ejemplo mandamos el objeto de la entidad a impresion a pantalla se transforma en la cadena definida, en este caso aparecera el valor del campo nombre. Si no defininos esta parte pasa que saldra asi como 'Cliente object' lo cual no se muy bien.

De nuevo, recomiendo echar un vistazo a la documentacion de models (mas adelante mencionare algo breve sobre relaciones entre entidades) por que es un tema amplio.

Paso 3-
Tenemos que activar nuestra app, abrimos el archivo:

/muebleria/settings.py

Buscamos el array INSTALLED_APPS y le agregamos el nombre de nuestra app, queda asi:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'clientes',
)

Paso 4-
Ahora hay que sincronizar la BD para crear las tablas del modelo de nuestra app, ejecutamos el comando:

> python manage.py syncdb

Paso 5-
Ahora vamos a activar nuestra app para que sea gestionada desde el area de administracion del sitio, es decir el crud de nuestra app en el lado del admin. Creamos un archivo llamado admin.py en la carpeta de nuestra app:

/muebleria/clientes/admin.py

Lo abrimos y registramos la entidad de nuestro modelo, asi:

from clientes.models import Cliente
from django.contrib import admin

admin.site.register(Cliente)

Hemos terminado. Hasta la proxima y feliz año nuevo!!!!!








...



Jejeje bueno aun no es tiempo de despedirse pero si hemos terminado, ya esta la app clientes con su crud trabajando en el lado del admin: Comprobemoslo, inicien el servidor, comando:

> python manage.py runserver

En nuestro navegador ponemos la url

http://localhost:8000/admin/

Nos logeamos con los datos de superuser y veran que sale nuestra app, asi:




Para las apps de productos y ventas solo hay que repetir los mismos 5 pasos, obviamente cada uno con su nombre y modelo propio.

De hecho decidi hacer el ejemplo con la app clientes ya que el modelo es super basico (una entidad con dos campos!) pero antes de poner punto final a al entrada hagamos las apps de productos y ventas solo para comentar unos puntos extra necesarios. Muy bien, Paso 1 crear la app con el nombre 'productos' (si no recuerdas el comando el paso 1 esta arriba). Paso 2 crear el modelo, esto es algo que hay que comentar, el modelo queda asi:

from django.db import models

class Categoria(models.Model):
id=models.AutoField(primary_key=True)
categoria=models.CharField(max_length=55)

def __unicode__(self):
return self.categoria

class Producto(models.Model):
id=models.AutoField(primary_key=True)
nombre=models.CharField(max_length=55)
precio=models.DecimalField(max_digits=8, decimal_places=2)
categoria=models.ForeignKey(Categoria)

def __unicode__(self):
return self.nombre

A comentar:

  • Aqui son dos entidades (Categoria y Producto), no solo una, una app puede tener N entidades
  • En la entidad Producto vean el ultimo campo, categoria, es una relacion a la entidad Categoria, asi se
    define una relacion uno a muchos desde una entidad a otra (un producto tiene una categoria)

Continuamos, paso 3 y paso 4. Luego paso 5, aqui hay que comentar algo, el archivo admin.py del paso 5 nos queda asi:

from productos.models import Categoria
from productos.models import Producto
from django.contrib import admin

admin.site.register(Categoria)
admin.site.register(Producto)

A comentar:

  • Aqui se importan las dos entidades, si tuvieramos 5 importariamos 5, asi hasta N entidades como tenga el modelo de nuestra app

Listo! vamos a hacer la app ventas: Paso 1 crear app con nombre 'ventas'. Paso 2 el modelo queda asi:

from django.db import models
from productos.models import Producto
from clientes.models import Cliente

class Venta(models.Model):
id=models.AutoField(primary_key=True)
factura=models.IntegerField()
fecha=models.DateTimeField(auto_now=False, auto_now_add=False)
cliente=models.ForeignKey(Cliente)
productos=models.ManyToManyField(Producto)

def __unicode__(self):
return self.factura

A comentar:

  • Aqui use una relacion muchos a uno en la linea: cliente=models.ForeignKey(Cliente)
  • Aqui use una relacion muchos a muchos en la linea: productos=models.ManyToManyField(Producto)
  • Ambas relaciones estan hechas con entidades que pertenecen al modelo de app distintas, para eso use imports, noten las
    lineas 2 y 3, import desde las apps productos y clientes.

Ya para finalizar, paso 3, paso 4 y paso 5... Habemus finalizadus.

Nuestro panel de admin se ve asi:



Les recomiendo que desde el panel de admin creen un registro de cliente, uno de categoria y uno de producto (app productos) y luego uno de venta. Vean como el crud generado por django ya nos va manejando las relaciones, esta es la pantalla de la creacion de un registro de venta (noten el detalle de los campos para el dato de fecha (generado por django)):



Ahora si es todo para esta entrada, ¡feliz 2014!




Comentarios

  1. Hola que tal gracias por el tuto estoy empezando con la programada con Django y solo aquí estoy entendiendo todo esto, tengo una duda hice todo lo de esta sección pero al entrar al administrador no me aparece la opción de ventas, todo lo demás sip, me podría decir que me hace falta?

    Gracias de antemano.

    ResponderEliminar

Publicar un comentario

Entradas populares