miércoles, 3 de abril de 2013

Tutorial Django: Formularios con base de datos I

Este tutorial django es una continuación del anterior Tutorial Django: Crear plantillas. Ahora configuraremos los parámetros de la base de datos, crearemos una tabla e insertaremos datos en ella mediante un formulario.

Para empezar nos vamos a nuestro archivo settings.py ubicado en nuestra carpeta proyecto1. En él vamos a ir configurando los parámetros de la base de datos.

Dentro de DATABASES = {

'ENGINE': 'django.db.backends.',     lo cambiaré por     'ENGINE': 'django.db.backends.mysql',
'NAME': '',    lo cambiaré por  'NAME': 'djangodb',
'USER': '',    lo cambiaré por   'USER': 'root',
 'PASSWORD': '',   lo cambiaré por    'PASSWORD': 'root',

'HOST': '', y 'PORT': '',  los dejaré en blanco para que tomen los valores por defecto.

Como verás primero, en ENGINE, hemos especificado que tipo de base de datos queremos. Teníamos la opción de utilizar postgresql_psycopg2, mysql, sqlite3 o oracle. Yo utilizaré mysql.

En NAME ponemos el nombre de una nueva base de datos que vamos a crear ahora, por lo que entramos a phpmyadmin y creamos una nueva con el nombre djangodb. No crearemos ninguna tabla.




En USER y PASSWORD tenemos que poner el nombre de usuario y password de acceso a nuestro phpmyadmin, en mi caso root y root

En HOST al dejarlo en blanco tomará el valor por defecto "localhost", al igual que el puerto.



Siguiente en el archivo settings.py buscamos INSTALLED_APPS = ( y añadimos una línea indicando el nombre de nuestra aplicación "aplicación1":

De momento no tocaremos más el archivo settings.py



Nos vamos a nuestro archivo models.py de nuestra carpeta aplicacion1, donde crearemos nuestro primer modelo. En archivo actualmente tan solo importa models y tiene un comentario. Creamos nuestro modelo:



class Persona(models.Model):
    nombre = models.CharField(max_length=30)
    edad = models.IntegerField()
    aficion = models.CharField(max_length=50)


Lo que hemos hecho es crear una clase/modelo llamada persona que tendrá un nombre (VARCHAR de máximo 30), una edad (INTEGER) y una afición (VARCHAR de máximo 50).

Vamos a crear estos campos en nuestra base de datos "djangodb" que especificamos anteriormente. Para ello:

1.- Abrimos la consola y nos situamos dentro de nuestra capreta principal /proyecto1
2.- Lanzamos el comando

python manage.py sqlall aplicacion1

En aplicacion1 pondremos el nombre de nuestra aplicación. Como ves nos ha creado la tabla "aplicacion1_persona" y nos ha añadido un campo único (id) auto-incremental. Si nos vamos ahora a phpmyadmin aún no veremos la tabla creada ya que hay que sincronizarla.

3.- Lanzamos el comando

python manage.py syncdb


4.- Nos pedirá que si queremos crear un usuario, le damos a sí y le introducimos los datos.
5.- Entramos a phpmyadmin para comprobar que nos ha creado la tabla nueva "aplicacion1_persona", además de tablas de autenticación, usuarios, grupos...



Nuestras tablas ya se han creado. Yo insertaré un par de registros en nuestra tabla aplicacion1_persona (al final de este tutorial lo insertaremos mediante un formulario):
Una vez tenemos un par de registros crearemos un nuevo archivo .html nos vamos a editar nuestro archivo views.py de nuestra carpeta aplicacion1

Al principio del archivo importaremos el modelo que creamos anteriormente de la siguiente manera:

from aplicacion1.models import Persona

y añadimos la siguiente funcion/vista



def mostrarTabla(request):
    personas = Persona.objects.all()
    return render_to_response('tabla.html',{'personas': personas })




lo que estamos haciendo es importar el modelo Persona y en una variable personas meter todos sus objetos (en este caso solo tendrá los dos que introducimos anteriormente). Una vez tenemos todos los objetos en la variable personas llamamos a tabla.html pasándole este variable.

Nos vamos a nuestra carpeta plantillas y en ella creamos un nuevo .html llamado tabla.html que tendrá el siguiente código:




{% extends "miplantilla.html" %}

{% block titulo %} Tabla de personas {% endblock titulo %}


{% block contenido %}
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Edad</th>
<th>Aficion</th>
</tr>
</thead>
<tbody>
{% for persona in personas %}
<tr>
<td>{{ persona.nombre }}</td>
<td>{{ persona.edad }}</td>
<td>{{ persona.aficion }}</td>
</tr>
{% empty %}
<tr><td colspan="4">No hay personas registradas</td></tr>
{% endfor %}
</tbody>
</table>

{% endblock contenido %}


Como verás hemos vuelto a extender de la plantilla creada en el tutorial anterior llamada miplantilla.html Dentro de bloque contenido hemos creado una tabla con un bucle for con el que hemos recorrido la variable "personas" que recibíamos, pintando una fila por cada persona. También le hemos añadido la opción de empty por si la variable "personas" estuviera vacia para que nos mostrase otro mensaje.

De esta manera solo nos queda irnos a nuestro archivo urls.py de proyecto 1 e introducir una nueva url, en mi caso:

url(r'tabla/', 'aplicacion1.views.mostrarTabla'),

Ahora ya podemos ir al navegador y abrir la url la url http://localhost:8000/tabla y ver como el bucle for a hecho su trabajo recorriendo toda la variable "personas" y pintando la tabla.


El siguiente paso es crear un formulario para poder insertar datos en esta tabla. Para ello nos vamos a crear un nuevo archivo llamado formularios.py en nuestro carpeta aplicacion1. En este archivo vamos a introducir el siguiente código:



from django.forms import ModelForm
from aplicacion1.models import Persona

class FormularioPersonas(ModelForm):
    class Meta:
        model = Persona



lo que hacemos es importar ModeloForm y Persona.
Nos volvemos a views.py e importamos el formulario que acabamos de crear con

from aplicacion1.formularios import FormularioPersonas

también importaremos:

from django.shortcuts import render
from django.http import HttpResponseRedirect


creamos una nueva vista de la siguiente manera:




def formulario(request):
    if request.method=="POST":
        formulario=FormularioPersonas(request.POST)
        if formulario.is_valid():
            formulario.save()
            return HttpResponseRedirect("/tabla")
    else:
        formulario=FormularioPersonas()
    return render(request, 'agregarPersona.html', {'formulario': formulario})




Lo que hacemos es comprobar si hay un método POST, si lo hay lo metemos en una variable formulario y comprobamos que el formulario es válido y lo guardamos. Redireccionamos a la url /tabla. En caso de que no haya método POST es formulario estará vacío. Finalmente llamamos a agregarPersona.html pasándole la variable formulario.


Creamos ahora la página agregarPersona.html en nuestra carpeta plantillas y que tendrá:



{% extends "miplantilla.html" %}

{% block titulo %} Insertar nueva persona {% endblock titulo %}


{% block contenido %}
<form method="POST">{% csrf_token %}

{{ formulario }}

<input type="submit" value="Enviar" />

</form>

{% endblock contenido %}


Como ves volvemos a extender de plantillas y en el contenido le insertamos un form con la variable formulario que nos mostrará los campos nombre, edad y afición y luego añadimos un botón de enviar.

Solo nos queda ir a urls.py y configurar la url para esta página, yo lo haré de la siguiente manera:

url(r'insertar/', 'aplicacion1.views.agregar_productos'),


Podremos ya abrir una navegador e ir a la página  http://localhost:8000/insertar/ para ver que nos ha creado el formulario. Si lo rellenamos y pulsamos en enviar nos devolverá a la página /tabla con el registro ya añadido


Si entrásemos ahora en phpmyadmin y comprobásemos la tabla aplicacion1_persona veremos que en ella se encuentran los registros que hemos introducido desde el formulario.

Como paso final, aconsejar dar estilos a la tabla con librerías como Bootstrap o dataTables, seguro que se verá mucho mejor :)


Parte 1.- Tutorial Django: Hola Mundo, primer proyecto y aplicación
Parte 2.- Tutorial Django: Crear plantillas
Parte 3.- Tutorial Django: Formularios con base de datos I
Parte 4.- Tutorial Django: Formularios con base de datos II

5 comentarios:

  1. Muchas gracias por el tutorial.

    ResponderEliminar
  2. Probando el tutorial... se agradece!

    ResponderEliminar
  3. Hay un error en la siguiente línea: url(r'insertar/', 'aplicacion1.views.agregar_productos'), debería ser: url(r'insertar/', 'aplicacion1.views.formulario'),

    ResponderEliminar
  4. excelente , aver cuando haces uno de store procedures y triggers

    ResponderEliminar