¡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 Articulo12 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 = Articulo1234 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 claseMeta
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í:
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:
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í:
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:
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 importamosHttpResponseRedirect
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étodoform.is_valid()
y de esta información estar correcta se procede a guardarla en la base de datos conform.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 anteriormenteform = ArticuloForm()
El archivo views.py
debería lucir así:
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:
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 runserver1 $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!