mantener la paginación en funcionamiento, es necesario pasar a la plantilla el objeto de página correcto. La vista genérica ListView de Django pasa la página seleccionada en una variable llamada page_obj, por lo que hay que editar la plantilla post/list.html de acuerdo con dicho nombre. Para ello realizará la siguiente modificación:
Para verificar que todo funciona correctamente del mismo modo que lo hacía la vista post_list, abra http://127.0.0.1:8000/blog/ en el navegador. Este es un ejemplo sencillo de una vista basada en clase que utiliza una clase genérica provista por Django. Se profundizará más sobre vistas basadas en clase en el capítulo 10, Construir una plataforma E-Learning, y en capítulos sucesivos.
Resumen
En este capítulo se han descrito los elementos básicos de Django para la creación de una aplicación tipo blog. Se han diseñado los modelos de datos, aplicando migraciones al proyecto. También se han creado las vistas, plantillas y patrones de URL necesarios para el blog, incluyendo la paginación.
En el siguiente capítulo se describe cómo mejorar el blog con un sistema de comentarios y etiquetado y permitir a los usuarios compartir artículos por email.
2
Funciones avanzadas del blog
En el capítulo anterior creó una aplicación sencilla tipo blog. En este capítulo se mejorará la aplicación con funcionalidades avanzadas como compartir artículos por email, añadir comentarios, etiquetar artículos y recuperar artículos por semejanza. En este capítulo se tratarán los siguientes puntos:
• Envío de emails con Django.
• Creación y gestión de formularios en vistas.
• Creación de formularios a partir de modelos de datos.
• Integración con aplicaciones de terceros.
• Construcción de QuerySets complejos.
Compartir artículos por email
Lo primero que se hará será permitir que los usuarios compartan artículos enviando un correo electrónico. Piense cómo podría usar las vistas, los patrones de URL y las plantillas para crear esta funcionalidad con lo que aprendió en el capítulo anterior. Ahora, se detallará qué necesita para permitir a los usuarios enviar artículos por email:
• Crear un formulario para los usuarios para rellenar su nombre y correo electrónico, el correo del destinatario y un comentario, como campo opcional.
• Crear una vista en el fichero views.py que gestione los datos y envíe el email.
• Añadir un patrón de URL para la nueva vista en el fichero urls.py de la aplicación blog.
• Crear una plantilla para visualizar el formulario.
Crear formularios en Django
A continuación, se describe cómo elaborar un formulario para compartir artículos. Django tiene un sistema de formularios con el que crear formularios web de una manera sencilla. Este sistema permite definir los campos del formulario, el modo en que se visualizan y la forma de validación de la entrada de datos. Con este sistema, Django ofrece una forma sencilla y flexible de visualizar formularios y gestionar datos.
Django incluye dos clases base para la elaboración de formularios:
• Form, que permite construir un formulario estándar.
• ModelForm, que permite construir un formulario a partir de una instancia de modelo de datos.
Primero cree el fichero forms.py dentro del directorio blog de la aplicación con el siguiente contenido:
Este es el primer formulario de Django. La clase que ha creado hereda de la clase base Form, donde se definen diferentes atributos con tipos específicos, encargados de la validación de los campos.
El tipo del campo name es CharField. Este tipo de campo se renderiza como <input type=”text”> en código HTML. Cada tipo de campo tiene una representación HTML (o widget) asociada, que puede ser redefinida a través del parámetro widget. En el caso del campo comments, el widget definido es de tipo Textarea que quedará renderizado como <textarea> en HTML en lugar de <input>.
La validación de campos depende del tipo de campo definido. Por ejemplo, los campos email y to son campos del tipo EmailField. Ambos campos requieren una dirección válida de correo electrónico; en caso contrario, la validación de campos provocará una excepción de tipo forms.ValidationError y el formulario no podrá ser validado. Otros parámetros se tienen en cuenta a la hora de realizar la validación: hay un número máximo de caracteres definidos en el campo name, y también se especifica que el campo comments no es obligatorio. Todos estos parámetros se tienen en cuenta a la hora de realizar las validaciones. El tipo de campos que ha usado son solo una pequeña muestra de los que Django dispone. Puede encontrar información sobre todos los campos de formulario disponibles en https://docs.djangoproject.com/en/2.0/ref/forms/fields/.
Usar formularios en vistas
Ahora va a crear una nueva vista que gestione el formulario y el envío de email, siempre y cuando contenga información válida. Para ello editará el fichero views.py de la aplicación blog y añadirá el siguiente contenido:
Esta vista funciona del siguiente modo:
• Se define una vista llamada post_share que recibe un objeto request y un parámetro post_id.
• Haciendo uso del atajo get_object_or_404() se recupera el artículo por identificador y por estado published.
• Usará la misma vista para visualizar el formulario inicial y procesar la información enviada. Se identifica si el formulario ha sido enviado mediante el atributo method del objeto request. El formulario se envía por el método POST. Si se recibe una solicitud GET, se genera un formulario vacío. Si se recibe una petición POST, se debe procesar la información del formulario. Por este motivo, utilizará la sentencia condicional request.method == 'POST' para distinguir entre ambos escenarios.
Los siguientes pasos corresponden al procesamiento del formulario:
1. Cuando la vista se carga inicialmente con una solicitud GET, se crea una nueva instancia de formulario que se mostrará vacía en la plantilla HTML.
2. El usuario rellena el formulario y lo envía por método POST. En ese momento, se crea una instancia de formulario con los datos enviados contenidos en request.POST: