Formulario de Contacto y envío de emails con Django
Formulario de Contacto y envío de emails con Django

En este tutorial vamos a ver lo sencillo que es subir archivos con django, seguiremos trabajando de la misma forma, crearemos un nuevo proyecto, una aplicación, estableceremos la configuración de nuestro proyecto en el archivo settings, crearemos la url de nuestro formulario, crearemos el formulario en el archivo forms, crearemos un modelo, la vista que hará el proceso de subida del formulario y finalmente la plantilla html que mostrará el formulario al usuario, me parece que esta forma es bastante buena para entender el flujo de trabajo en Django.

Lo primero que debemos hacer es crear un nuevo proyecto, le podemos llamar uploads, así que nos ponemos donde queremos que sea creado el proyecto y desde la terminal escribimos lo siguiente.

Accedemos a nuestro proyecto

Y creamos una nueva aplicación a la que podemos llamar files, por ejemplo

Ahora podemos establecer las configuraciones de siempre en nuestro archivo settings, así que lo abrimos y modificamos lo siguiente.

Como puedes ver, tenemos una novedad, la constante MEDIA_ROOT, simplemente le debemos decir donde queremos guardar los archivos que sean subidos desde nuestra aplicación.

La configuración de la base de datos no necesitamos modificarla porque el ejemplo lo haremos con sqlite3, que es el que viene por defecto, más adelante haremos uso de mysql.

Si tienes dudas con alguno de los pasos anteriores, te recomiendo que veas este tutorial.

Ahora debemos crear en el archivo urls.py la nueva url desde la que accederemos a nuestro formulario, así que abre el archivo urls.py y añade la siguiente línea debajo de la ruta del admin.

Ahora vamos a crear el modelo Document, así que abre el archivo files/models.py y añade el siguiente código.

¿Que estamos haciendo aquí?, esa no debe ser la pregunta :(, el campo docfile debe ser la única duda, pero habla por si sólo, un campo de tipo file, al que le decimos con upload_to donde queremos que guarde los archivos subidos, en este caso y a día de hoy los guardará en media/documents/2014/03/02, así de sencillo.

Para que las tablas de nuestra base de datos sean creadas ejecuta el siguiente comando desde la terminal.

Ahora debes crear un nuevo archivo dentro de files llamado forms.py, aquí será donde creemos nuestro formulario.

Simple, un formulario con un campo de tipo texto llamado filename y otro de tipo file llamado docfile con una label que dirá Selecciona un archivo.

Ahora es el momento de crear la función upload_file en nuestro archivo views.py, la cuál será la encargada de procesar el formulario o en su defecto mostra la plantilla que muestre el formulario.

Por tener más opciones, en esta ocasión he utilizado render en lugar de render_to_response como en este tutorial, así tenemos más opciones. La principal diferencia entre estos dos, es que con render ya tenemos disponible el token en la vista, no así con render_to_response.

Como podemos ver, comprobamos si es una petición POST, pero a la hora de recoger datos, cogemos tanto POST como FILES, el resto te debe sonar y es sencillo de entender.

Ahora crea nuestra plantilla upload.html en el directorio templates en la raíz del proyecto, si no has creado el directorio hazlo y añade dentro del archivo el siguiente código.
 

Ahora es momento de encender el servidor, así que abre la terminal en el directorio del proyecto y escribe.

Accede a http://127.0.0.1:8000/uploads/ y si todo va bien deberás ver el formulario, si no tienes un gestor de sqlite3 te recomiendo que descargues este.

Trata de subir un nuevo archivo y busca dentro de tu proyecto en la carpeta media/documents/año/mes/dia/, debes ver el archivo que acabas de subir, y si miras la base de datos, también debes tener un nuevo registro con el nombre del archivo subido y la ruta completa del mismo.

Espero que te funcione y cualquier duda referente al post comenta, un saludo.