Django posee una interfaz administrativa que hemos estado utilizando hasta el momento en lo que va del curso, pero cuando nos encontramos en la posición de elaborar interfaces de entrada o edición de datos, para los usuarios de nuestra aplicación, en algunas circunstancias, darles acceso al administrador de Django resulta contraproducente.

Es por ello que resulta mejor preparar nuestros formularios para manejar estas circunstancias, entre otras ocasiones.

Para entender mejor lo que Django permite, veamos esta lista de ‘superpoderes’ de Django:

  • Mostrar un formulario HTML generado a partir de reglas básicas.
  • Generar formularios HTML validados a partir de modelos ya declarados.
  • Validar la información que se desea registrar a través del formulario.
  • Mostrar nuevamente el formulario, haciendo notar los errores que ha producido la validación.
  • Convertir la información subida en tipos de datos de Python, para procesarlos de acuerdo a las vistas.

Para nuestro ejemplo de la semana, usaremos tres formularios, dos de ellos generados a partir de modelos y uno sin relación a algún modelo, pero con la capacidad de procesar la información y enviar un correo electrónico, utilizando gmail.

Nota: El archivo forms.py

Para crear formularios se usa por convención un archivo nuevo llamado: forms.py que se ubicará en la carpeta de la aplicación, esa misma donde se encuentran los archivos: models.py y views.py. Sin embargo esto no es obligatorio, pueden crearse también en el archivo models.py

Creamos nuestro archivo forms.py y en las primeras líneas ponemos:

forms.py import

forms.py import

Estas líneas permitirán usar los elementos ya construidos (ModelForm para usar los modelos ya declarados, forms para declarar nuevas reglas para un formulario y los modelos de nuestra aplicación principal)

Hoja de Trucos

Como se ha estado haciendo costumbre, esta semana también tenemos una chuleta (cheatsheet) para el manejo de formularios con Django, esta contiene los campos que vienen ya construidos, los atributos y las opciones de validación.

Django Cheatsheet Forms

Django Cheatsheet Forms

Con esta referencia en mano empezamos a crear nuestros formularios.

Objetos Formulario

Un objeto formulario en Django es una secuencia de campos y reglas de validación, que permiten depurar la información requerida y procesarla eficientemente. Estos campos y reglas deben ser declarados en el orden que se desea que aparezcan. Las clases formulario son creadas como subclases de django.forms.Form y tienen un estilo de declaración muy similar a los modelos de Django.

Para nuestro ejemplo consideraremos implementar un formulario de contacto, que tendrá solo dos campos: un correo electrónico y un mensaje, debe lucir así:

ContactoForm

ContactoForm

Este Formulario, debe ir de la mano de una vista que permita procesar los datos que reciba, esta vista será declarada en views.py, primero debemos modificar nuestras primeras líneas para importar todo lo necesario, luego declarar una nueva vista.

views.py import

views.py import

contacto()

contacto()

En donde encontramos: [email protected], debe ser reemplazado por el email que recibirá el mensaje. Para que funcione el envio del mensaje al correo electrónico debemos, agregar al final de nuestro archivo settings.py, las siguientes configuraciones:

settings.py + gmail

settings.py + gmail

En donde encontramos: [email protected], debe ser reemplazado por la cuenta que enviará el mensaje (debe ser una cuenta válida en gmail). Necesitamos también una plantilla, en este caso se llamara: contacto.html

contactoform.html

contactoform.html

Para que nuestra aplicación sea navegable, modificamos base.html, para que quede con el siguiente menú:

base.html menu

base.html menu

También es necesaria una URL que convoque a esta vista por lo tanto debemos agregar la siguiente línea dentro de nuestra configuración en urls.py:

url(r'^contacto/$','principal.views.contacto'),

Formularios a partir de Modelos

Si se esta construyendo una aplicación que gestiona una base de datos, lo más apropiado es usar los modelos ya declarados como formularios, y así evitar estar repitiendo las mismas reglas para procesar los datos.

Por esta razon, Django provee una clase de ayuda que permite crear un formulario a partir de un modelo, esta clase se llama ModelForm, y se emplea así (forms.py):

RecetaForm y ComentarioForm

RecetaForm y ComentarioForm

Las vistas para manejar estos formularios serían estas:

nueva_receta() y nuevo_comentario()

nueva_receta() y nuevo_comentario()

Notar que se usa HttpResponseRedirect para redireccionar a una URL. Las plantillas recetaform.html y comentarioform.html serían estas:

recetaform.html

recetaform.html


comentarioform.html

comentarioform.html

Y tendríamos que modificar recetas.html para agregar un enlace para la creación de nuevas recetas

<a href="/receta/nueva">Agregar una receta</a>

La configuración para la URL esta:

url(r'^receta/nueva/$','principal.views.nueva_receta'),
url(r'^comenta/$','principal.views.nuevo_comentario'),

Resultado final

Los archivos: forms.py, views.py, urls.py y base.html quedán de la siguiente manera:

forms.py

forms.py

views.py (primera parte)

views.py (primera parte)

views.py (segunda parte)

views.py (segunda parte)

urls.py

urls.py

base.html

base.html

Y debemos tener las siguientes interfaces, como resultado:

Página de inicio

Página de inicio


Recetas

Recetas


Nueva receta

Nueva receta


Nuevo comentario

Nuevo comentario


Contacto

Contacto

Documentación oficial de Django

La mejor forma de enterarse todo lo que puede hacer Django, es revisando su documentación, para el caso de formularios tiene: La API de formularios, Campos de formulario, Validación de campos y formularios, Formularios múltiples, Archivos para procesar Formularios, Asistente para formularios, entre otras cosas más. Si deseas ir mas alla con los formularios, pues este es tu punto de partida.

Repositorio del proyecto y video complementario

Si te perdiste de algún detalle, o deseas ver como va quedando el código oficial de nuestro proyecto de ejemplo, no te olvides que siempre puedes revisar el repositorio del proyecto en github.

Por otro lado este video nos da mayores referencias del procesamiento de formularios con Django.
[youtube http://www.youtube.com/watch?v=Wh9a0obtQUQ]

La próxima semana: Archivos Estáticos

La próxima semana se viene un capítulo interesante sobre los archivos estáticos dentro de nuestro proyecto, los mas comunes son archivos CSS, JavaScript o imágenes que pertenezcan a la interfaz de nuestra aplicación. Veremos como agregarlos y ya podremos usar cualquier framework frontend para construir rápidamente nuestra interfaz.

No se olviden prácticar con proyectos propios, probar cosas diferentes al ejemplo, escribir código (no se aprende copiando y pegando), revisar la documentación, dejar sus comentarios que enriquecen increiblemente el curso, difundirlo a los que aún no conocen Django, twittear sobre el curso y todo lo que ustedes vienen haciendo con el curso.

Que tengan un buen inicio de semana :). Happy coding!