Tema 4: Formularios en Django

18/08/2022 · Actualizado: 27/03/2023

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Los formularios en cualquier página web es un punto de entrada de datos desde la web a nuestra base de datos o código, dependiendo de lo que queramos hacer con dicho formulario.

Los formularios más típicos son los de contacto, donde se especifican unos campos como: nombre, email y comentario. Sin embargo, un formulario es cualquier elemento en el que haya que cubrir datos y darle a enviar.

En Django hay varias maneras de implementar los formularios, dependiendo de qué tipo de datos queremos solicitar y cómo vamos a trabajar con ellos. Hoy vengo a hablarte precisamente de como implementar los diferentes tipos de formularios que podemos encontrar, así como los tipos de campos y widgets que tenemos a nuestra disposición. Si quieres saber como se estructuran los formularios en Django, sigue leyendo!

Índice
  1. ¿Qué es un formulario en la programación web?
  2. Tipos de formularios en Django
    1. Formularios de modelos en Django
    2. Formularios tradicionales
    3. Cuando utilizar un formulario tradicional o un formulario de modelos en Django

¿Qué es un formulario en la programación web?

En primer lugar, debes saber lo que es un formulario y como se especifica de forma general en cualquier página web usando HTML.

¿Todavía no sabes nada de CSS y HTML?

Como sabrás, en HTML hay diferentes tipos de etiquetas y la que utilizamos para crear un formulario es <form>. Dentro del formulario usamos la etiqueta <input> para especificar los elementos que recibirán información desde el formulario. Por ejemplo:

<form method="post">
  <p>Nombre: <input type="text" name="nombre" size="40"></p>
  <p>Año de nacimiento: <input type="number" name="nacido" min="1900"></p>
  <p>Sexo:
    <input type="radio" name="hm" value="h"> Hombre
    <input type="radio" name="hm" value="m"> Mujer
  </p>
  <p>
    <input type="submit" value="Enviar">
    <input type="reset" value="Borrar">
  </p>
</form>

Con el código HTML de arriba, obtendremos algo tal que así:

Nombre:

Año de nacimiento:

Sexo: Hombre Mujer

Con estos datos es más que suficiente para que entiendas el funcionamiento básico de los formularios. A lo largo del tema te iré explicando como operar con los datos que se cubren en el formulario, entre otras cosas.

Tipos de formularios en Django

Como te mencionaba hace unas cuantas líneas, en Django hay dos tipos de formularios. Estos se diferencian principalmente en formularios basados en modelos y formularios tradicionales. Hago esta distinción porque según lo que quieras hacer te interesa usar uno u otro y se implementan de forma ligeramente diferente.

Mientras que el formulario tradicional en Django nos obliga a implementar gran parte de la funcionalidad interna, los formularios basados en modelos son mucho más automáticos de utilizar y apenas tendremos que escribir líneas de código.

Formularios de modelos en Django

Los formularios de modelos son aquellos que interactúan directamente con nuestras bases de datos, con la intención, por lo general, de añadir filas de información a la misma.

La ventaja de estos formularios es que Django tiene un sistema interno muy centrado en operar con bases de datos, entonces la mayor parte de operaciones que tengamos intención de realizar es probable que ya existan o que únicamente debamos añadir un par de líneas de código.

Ejemplo de formulario basado en un modelo en Django

Para crear un formulario basado en un modelo de Django, tiene que cumplirse la condición de que tengamos un modelo en Django (como es lógico). La idea es que creemos un formulario que permita añadir elementos (filas) a la base de datos del modelo desde la página web.

Una vez hecho eso, necesitamos montar el formulario, la vista y visualizarlo usando el template. Vamos paso por paso.

  1. Modelo ✓
  2. Formulario
  3. Vista
  4. Template

Formulario

Para implementar el formulario basado en un modelo, debemos crear, en caso de que no exista, el fichero forms.py. En este fichero es donde debemos especificar todos los detalles de nuestro formulario.

Lo más importante cuando hagas un formulario basado en un modelo es que tiene que heredar de la clase ModelForm, pero dejando eso de lado, podemos hacer los formularios de dos maneras:

  • Especificando qué campos queremos que estén presentes en el formulario

Siguiendo con el ejemplo que estamos usando en el curso, con el modelo de Canciones, que puedes ver en este link, podríamos crear un formulario que use los campos de título, cantante y álbum, por ejemplo:

from django import forms
from .models import Canciones

class CancionesForm(forms.ModelForm): 

    class Meta:
        model = Canciones
        fields = ['titulo', 'cantante', 'album']
  • Usando la opción de "todos los campos del modelo"

En caso de que queramos crear un formulario que utilice todos los campos del modelo, no necesitamos especificarlos uno a uno, podemos usar '__all__' en el campo fields, como puedes ver en el código a continuación:

from django import forms
from .models import Canciones

class CancionesForm(forms.ModelForm): 

    class Meta:
        model = Canciones
        fields = '__all__'
  • Modelo ✓
  • Formulario ✓
  • Vista
  • Template

Vista

Por supuesto, necesitaremos asignar una vista en el fichero views.py. Para ello, lo primero es crear una clase asociada a dicha vista, y esta tiene que heredar de CreateView. Además, es importante especificar en las variables model y form_class las clases asociadas al modelo y al formulario del modelo.

from django.views.generic import CreateView
from .models import Canciones
from .forms import CancionesForm

class CancionesFormView(CreateView):

    template_name = "formularioCanciones.html"
    model = Canciones
    form_class = CancionesForm
  • Modelo ✓
  • Formulario ✓
  • Vista ✓
  • Template

Template

El último paso es usar el fichero formularioCanciones.html para mostrar los datos que tenemos en el modelo. Para ello, podemos utilizar diferentes formatos dependiendo de como queremos distribuir o visualizar la información del modelo.

Para acceder a las variables de python en el template en html, podemos utilizar la nomenclatura {{nombrevariable}}. En el caso de trabajar con un formulario, debemos utilizar la variable form, con la cual podremos acceder a los diferentes campos del formulario especificando el nombre de la variable precedida de un punto.

Podemos usar el formulario de dos maneras: la más sencilla es poner únicamente {{form}} en nuestro código HTML y con eso ya funcionaría; la segunda opción es acceder a cada campo para poder personalizar un poco más el formulario. Dado que esta segunda opción es un poco más compleja, voy a poner el ejemplo haciéndolo así.

<form method="post">
    {% csrf_token %}
    <div class="form-group">
       {{ form.titulo }}
    </div>
    <div class="form-group">
        {{ form.cantante }}
    </div>
    <div class="form-group">
        {{ form.album }}
    </div>
    <div class="form-group center">
        <input class="btn" type="submit" value="Añadir">
    </div>
</form>

Ya ves que no es tan complicado. Si quisieras añadir etiquetas para especificar qué hay que añadir a cada input, lo único que debes añadir es un tag <label>.

  • Modelo ✓
  • Formulario ✓
  • Vista ✓
  • Template ✓

Formularios tradicionales

Por otro lado, cuando hablo de formularios tradicionales me refiero a aquellos que podemos implementar simplemente en html y con cualquier lenguaje de backend.

En estos casos, aunque Django nos pone ciertas comodidades, es cierto que tendremos que implementar la funcionalidad tras darle al botón de "Enviar" en el formulario.

Como en el caso anterior, debemos especificar en el fichero forms.py el formulario y su estructura, pero esta vez será un poco diferente ya que al no heredar los campos de un modelo, habrá que especificar un par de cosas más.

Ejemplo de formulario tradicional en Django

Siguiendo con el ejemplo anterior, vamos a ver como tendríamos que hacer un formulario que recoja los datos de una canción de forma similar al ejemplo anterior (título, cantante y álbum) pero sin pertenecer a un modelo.

Primero, en el fichero forms.py especificamos que la clase del formulario hereda de Forms, una clase de Django. Además, debemos especificar el tipo de campo y widget con el que se representará en el html.

from django import forms
from .models import Canciones
from .forms import CancionesForm

class CancionesFormView(forms.Form):

    titulo = forms.CharField(required=True, widget=forms.TextInput())
    cantante = forms.CharField(required=True, widget=forms.TextInput())
    album = forms.CharField(required=True, widget=forms.TextInput())

En la clase vista, tenemos que asociar el formulario concreto a la vista que utilicemos, de una manera similar a la anterior.

Una vez hecho esto, podemos usar el mismo código en html que en el ejemplo anterior, ya que usamos los mismos nombres.

<form method="post">
    {% csrf_token %}
    <div class="form-group">
       {{ form.titulo }}
    </div>
    <div class="form-group">
        {{ form.cantante }}
    </div>
    <div class="form-group">
        {{ form.album }}
    </div>
    <div class="form-group center">
        <input class="btn" type="submit" value="Añadir">
    </div>
</form>

Para terminar, desde la vista usaremos la información ge POST para manejar la información que viene del formulario:

if request.method == 'POST':
    form = CancionesFormView(request.POST)
    if form.is_valid():
        titulo = form.cleaned_data['titulo']
        cantante = form.cleaned_data['cantante']
        album = form.cleaned_data['album']
        // TODO: lo que quieras hacer con los datos

Cuando utilizar un formulario tradicional o un formulario de modelos en Django

Como imaginarás, hay diferentes contextos en los que nos interesará usar los formularios normales o los que se basan en modelos de Django.

Lo cierto es que Django fomenta el uso de modelos y todas las funcionalidades del framework están muy orientadas a que los modelos se integren con el resto de funcionalidades.

Ahora bien, hay ocasiones en las que no merece la pena usar un modelo para nuestros formularios. A grandes rasgos NO debemos usar un modelo en nuestros formularios cuando:

  • No queremos almacenar la información del formulario

Y ya esta, no hay más complicaciones. Por lo general, usamos formularios tradicionales para los típicos formularios de contacto o para enviar un mail. Es decir, cuando el formulario sirve para realizar una acción que no implica guardar datos.

Por el contrario, debemos usar un formulario con modelos cuando el formulario interactúe directamente con la base de datos.

Pionera del caos

Ingeniera Informática con Máster en Bioinformática, casi doctora y freelancer. Todo lo que te cuento en este blog son aprendizajes que yo misma he tenido ya sea durante mis estudios o en otros proyectos!

Otras Entradas Relacionadas

  1. Ezequiel dice:

    ¡Muchas gracias por tu artículo!. ME fue de gran ayuda.
    Si embargo tengo la siguiente pregunta... Imaginemos que necesito dar de alta a un usuario en una página web, con lo cual debo guardar sus dato en una base de datos. Según entiendo, entonces debería implementar un formulario por modelos, ya que debo guardar los datos del usuario. Si el usuario ingresa por segunda vez y solamente debo constatar los datos ingresados por el usuario con los datos registrados en la base de datos... ¿en este caso debo usar un formulario tradicional? ¿Es esto correcto? Dede ya ¡muchísimas gracias!

    1. Macarena dice:

      Para eso no hace falta que lo implementes tu, porque ya hay funcionalidades en Django que tienen implementado el sistema de usuarios. En el blog todavía no he hablado de ello, pero en este link tienes un tutorial: https://developer.mozilla.org/es/docs/Learn/Server-side/Django/Authentication

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *



Para continuar es necesario que confirmes la política de privacidad de la web.

Subir