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.

Django: Crea un formulario con varios modelos usando django-betterforms

¡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

  1. Configurando el proyecto
  2. Creamos la aplicacion catálogos
  3. Creando los formularios
  4. 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: