Django: Crea un formulario con varios modelos usando django-betterforms
A menudo cuando desarrollamos aplicaciones web nos encontramos con varias situaciones; una de ellas es guardar datos en un formulario que están en diferentes modelos.
¡Claro! Es un poco complicado tener un formulario con diferentes modelos y más cuando lo hacemos con la clase FormView
. ¡No se preocupen! Les mostraré como hacerlo más fácil usando un paquete de python para django llamado django-betterforms.
Tabla de contenido
- Configurando el proyecto
- Creamos la aplicacion catálogos
- Creando los formularios
- Implementando los formularios con CreateView
Configurando el proyecto
Primero instalamos el paquete django-betterforms en nuestro entorno virtual y creamos el proyecto. Lo llamaré demobetterform.
$ (entornovirtual) pip install django-betterforms
$ (entornovirtual) django-admin.py startproject demobetterform
Si quieres saber cómo configurar el proyecto y poder seguir ésta guía te recomiendo éste post. Recuerda hacer las migraciones al crear el proyecto y al modificar los modelos.
Creamos la aplicacion catálogos
Una vez creado el proyecto creamos una app. La llamaremos catálogos. Usamos el django-admin de ésta forma:
$ (entornovirtual) django-admin.py startapp catalogos
Entramos a la carpeta catalogos y abrimos nuestro archivo models.py
y agregamos dos modelos de modo que uno será maestro y otro detalle:
class Persona(models.Model):
nombre = models.CharField(max_length=50)
apellido = models.CharField(max_length=50)
class Empleado(models.Model):
CATEGORIAS = (
(0, 'Secretario'),
(1, 'Tesorero'),
(2, 'Jefe')
)
categoria = models.CharField(choices=CATEGORIAS, max_length=2)
salario = models.DecimalField(max_digits=8, decimal_places=2)
persona = models.ForeignKey(Persona, on_delete=models.CASCADE)
Hacemos la migración para tener los nuevos cambios reflejados en la base de datos.
(entornovirtual)> python manage.py makemigrations catalogos
Migrations for 'catalogos':
apps\catalogos\migrations\0001_initial.py
- Create model Empleado
- Create model Persona
- Add field persona to empleado
(entornovirtual) python manage.py migrate catalogos 0001
Operations to perform:
Target specific migration: 0001_initial, from catalogos
Running migrations:
Applying catalogos.0001_initial... OK
Creando los formularios
Dentro del directorio catálogos crea un archivo llamado forms.py
y escribe lo siguiente: