post thumbnail

Django desde Cero: Formularios (Forms)

Publicado Por: Carlos Picca, El 18/09/2013


Detalles del Curso:

Dificultad: Novato

Duración: 20 min


Bienvenidos una vez más a Django desde Cero, curso en el cual aprendemos a programar sin conocimiento alguno. En el capítulo anterior, te enseñe como como configurar, acceder y manejar el módulo de administrador que viene pre-instalado con Django. Si eres nuevo en este curso, te recomiendo que le eches un vistazo al capítulo anterior para que te pongas en contexto (Capítulo 4 - Sitio de Administración )

Hoy, vamos a ver como crear forms o formularios con la ayuda de la librería que trae pre-instalada Django.

¡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

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

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

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'),

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'),
)

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

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)

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)

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>

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

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

form-django

Ahora cargamos unos datos de prueba:

llenado-form-django

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

todos-articulos-django

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!


¿Te ha gustado esta publicación?

Compártela:

Por Carlos Picca

Conoce más sobre este autor aquí


comments powered by Disqus