Django desde Cero: Formularios (Forms)

Publicado el 18 septiembre 2013 por Codehero @codeheroblog

¡Alerta!

Todos los ejemplos usados en el tutorial de son una continuación de los ejemplos del capitulo anterior.


¿Qué es un form o formulario?

Una colección de campos que sabe cómo validarse a sí mismo y mostrarse como HTML.

Beneficios de usar la librería pre-instalada de Django

  • Mostrar un formulario HTML con los campos de formulario generados automáticamente.
  • Comprobar los datos presentados en contra de un conjunto de reglas de validación.
  • Volver a mostrar un formulario en el caso de errores de validación.
  • Convertir datos del formulario a los tipos de datos de Python pertinentes.

La mejor forma de aprender a usar las forms o formularios dentro del framework es a través de un ejemplo, en nuestro caso vamos a seguir usando el ejemplo del capítulo anterior. Si no lo has leído te recomiendo que lo visites Capítulo 4 – Sitio de Administración.

Para crear un form en Django vamos a necesitar hacer lo siguiente.


Generar nuestro archivo forms.py

Django nos provee una manera sencilla y eficiente para la creación de forms o formularios dentro de nuestro sitio web. Lo primero que necesitamos hacer es crear el archivo forms.py dentro de nuestra aplicación. En nuestro caso va a ser dentro de la app blog.

Dentro de este archivo vamos a declarar todos los forms o formularios que va a usar nuestro aplicativo. Empezamos por agregar las siguientes dependencias:

from django import forms from models import Articulo

12 from django import formsfrom models import Articulo

Observemos que para que las forms o formularios funcionen necesitamos importar todas la funcionalidades del modulo forms propio de Django. Por otro lado, necesitamos importar el modulo Articulo de nuestros modelos para que así Django pueda saber que meta-data usar a la hora de renderizar el form en nuestro sitio web.

Lo siguiente es crear un clase que contenga y maneje el form que queremos hacer. Veamos como:

class ArticuloForm(forms.ModelForm): class Meta: model = Articulo

1234 classArticuloForm(formsModelForm):    classMeta:  model=Articulo

Dos cosas que debemos observar, la primera, todos los forms o formularios que queramos crear debemos extenderlos de la clase forms.ModelForm, y segundo, debemos crear una clase Meta dentro de nuestro form para que así Django realice el link entre los datos que contiene el modelo Artículo y los campos html del form.

El archivo forms.py debería lucir así:

from django import forms from models import Articulo class ArticuloForm(forms.ModelForm): class Meta: model = Articulo

1234567 from django import formsfrom models import Articulo classArticuloForm(formsModelForm):    classMeta:  model=Articulo


Agregar un url

Para que el usuario pueda llegar a la vista del form que creamos anteriormente debemos especificar una nueva ruta dentro del archivo urls.py. Veamos como hacerlo:

En el archivo urls.py agregamos la siguiente linea:

url(r'^crear/', 'blog.views.crear', name='crear'),

1 url(r'^crear/','blog.views.crear',name='crear'),

Observemos que nuestra nueva ruta la denominamos crear pero puedes darle el nombre que tu necesites.

El archivo urls.py debería lucir así:

from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'PrimerBlog.views.home', name='home'), # url(r'^PrimerBlog/', include('PrimerBlog.foo.urls')), url(r'^$', 'blog.views.home', name='home'), # Uncomment the admin/doc line below to enable admin documentation: url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), url(r'^crear/', 'blog.views.crear', name='crear'), )

1234567891011121314151617181920 from djangoconfurls import patterns,include,url # Uncomment the next two lines to enable the admin:from djangocontrib import adminadminautodiscover() urlpatterns=patterns('',  # Examples:  # url(r'^$', 'PrimerBlog.views.home', name='home'),  # url(r'^PrimerBlog/', include('PrimerBlog.foo.urls')),  url(r'^$','blog.views.home',name='home'),   # Uncomment the admin/doc line below to enable admin documentation:  url(r'^admin/doc/',include('django.contrib.admindocs.urls')),   # Uncomment the next line to enable the admin:  url(r'^admin/',include(adminsiteurls)),   url(r'^crear/','blog.views.crear',name='crear'),)

Si necesitas ayuda para entender como funcionan las rutas dentro de Django, te recomiendo el siguiente capitulo del curso Capítulo 3 – Vistas Dinámicas


Definimos la vista

No basta con definir el form y la ruta, también necesitamos decirle a Django que va a realizar con los datos que obtenga de ese form. Es en este punto donde vienen las definiciones de las vistas a ayudarnos. Veamos como definir nuestra vista:

Lo primero que tenemos que hacer es ir al archivo views.py dentro de nutra app blog. Una vez ahí vamos a agregar las siguientes dependencias:

from forms import ArticuloForm from django.http import HttpResponseRedirect from django.core.context_processors import csrf

123 from forms import ArticuloFormfrom djangohttp import HttpResponseRedirectfrom djangocorecontext_processors import csrf

Observemos que necesitamos importar la clase ArticuloForm que creamos anteriormente para así poder manejarla desde acá, y aparte importamos HttpResponseRedirect para poder redirigir a la vista de todos los artículos una ves que el proceso haya concluido.

Debemos definir la vista como tal. Veamos como:

def crear(request): if request.POST: form = ArticuloForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/') else: form = ArticuloForm() args = {} args.update(csrf(request)) args['form'] = form return render_to_response('crear_articulo.html', args)

12345678910111213141516 def crear(request):  ifrequestPOST:  form=ArticuloForm(requestPOST)  ifformis_valid():  formsave()   returnHttpResponseRedirect('/')  else:  form=ArticuloForm()     args={}  argsupdate(csrf(request))    args['form']=form   returnrender_to_response('crear_articulo.html',args)

Básicamente lo que hace este método es validar que el request sea de tipo request.POST, de serlo, se valida la información del form con el método form.is_valid() y de esta información estar correcta se procede a guardarla en la base de datos con form.save().

Si por el contrario el request no fuese de tipo POST se procede a renderizar el template crear_articulo.html con el form que creamos anteriormente form = ArticuloForm()

El archivo views.py debería lucir así:

from django.shortcuts import render_to_response from blog.models import Articulo from forms import ArticuloForm from django.http import HttpResponseRedirect from django.core.context_processors import csrf def home(request): entradas = Articulo.objects.all()[:10] return render_to_response('index.html', {'articulos' : entradas}) def crear(request): if request.POST: form = ArticuloForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/') else: form = ArticuloForm() args = {} args.update(csrf(request)) args['form'] = form return render_to_response('crear_articulo.html', args)

12345678910111213141516171819202122232425262728 from djangoshortcuts import render_to_responsefrom blogmodels import Articulofrom forms import ArticuloFormfrom djangohttp import HttpResponseRedirectfrom djangocorecontext_processors import csrf  def home(request):   entradas=Articuloobjectsall()[:10]   returnrender_to_response('index.html',{'articulos':entradas}) def crear(request):  ifrequestPOST:  form=ArticuloForm(requestPOST)  ifformis_valid():  formsave()   returnHttpResponseRedirect('/')  else:  form=ArticuloForm()     args={}  argsupdate(csrf(request))    args['form']=form   returnrender_to_response('crear_articulo.html',args)

Si quieres saber más sobre el funcionamiento de templates o plantillas dentro de Django te recomiendo que le eches un vistazo al Capítulo 3 – Vistas Dinámicas


Generar la plantilla

El último paso para crear un form con Django es generar la plantilla o template que va a renderizar el form que declaramos anteriormente. Veamos como hacerlo:

Debemos crear el archivo crear_articulo.html dentro de la carpeta templates en la app blog y agregarle el siguiente código:

<form action="/crear/" method="post">{% csrf_token %} <ul> {{ form.as_ul }} </ul> <input type="submit" name="submit" value="Crear Articulo"> </form>

1234567 <form action="/crear/"method="post">{%csrf_token%}<ul>{{formas_ul}}</ul> <input type="submit"name="submit"value="Crear Articulo"></form>

Observemos que dentro de esta plantilla es donde renderizamos el form que creamos anteriormente con el método form.as_ul, a su vez es donde especificamos la dirección de la ruta que Django tiene que buscar para poder procesar el form, en nuestro caso /crear/.


Probemos

Si cumplimos todos los pasos anterior no debería existir ningún problema al probar nuestro form. Veamos que debemos hacer:

Primero que nada es encender el servidor:

$ python manage.py runserver

1 $python managepy runserver

Una vez que encienda navegamos hacia la ruta que creamos http://127.0.0.1:8000/crear:

Ahora cargamos unos datos de prueba:

Si clickeamos Crear Articulo deberíamos observar el nuevo articulo:

Si quieres saber más información acerca de los forms o formularios en Django, te recomiendo que visites Formularios Django


Conclusión

En esta lección, aprendimos como crear forms o formularios con la ayuda de la librería que trae pre-instalada Django. Si tienes alguna pregunta, yo estaré feliz de responderte en los comentarios, además espero que te unas y le eches un vistazo a todo el resto de este curso.

¡Te espero la próxima semana!