4. Si el formulario no es válido, se renderizará la plantilla de nuevo, con la información enviada, mostrando un mensaje de error en las validaciones que hubiesen fallado.
5. Si el formulario es válido, se recuperarán los datos validados a través de form.claened_data. Este atributo es de tipo diccionario, donde las claves son los nombres de los campos del formulario.
A continuación se describe cómo se envían correos electrónicos con Django para completar la funcionalidad.
Enviar emails con Django
Enviar emails con Django es una acción muy directa. Primero hay que disponer de un servidor SMTP local o definir uno externo en la configuración, incluyendo la siguiente información en el fichero de configuración settigns.py del proyecto:
• EMAIL_HOST es el nombre donde se aloja el servidor SMTP. Por defecto es localhost.
• EMAIL_PORT es el puerto del SMTP. Por defecto es 25.
• EMAIL_HOST_USER es el usuario del servidor SMTP.
• EMAIL_HOST_PASSWORD es la contraseña de usuario del servidor SMTP.
• EMAIL_USE_TLS indica si debe usar la conexión segura sobre TLS.
• EMAIL_USE_SSL indica si usar una conexión TLS implícita.
Si no dispone de un servidor SMTP, puede indicar a Django que escriba los emails en la consola, a través de la siguiente línea en la configuración:
Con esta configuración, Django escribirá todos los emails a través del intérprete. Esta opción es útil para tareas de validación de la aplicación sin disponer de un servidor SMTP.
Si lo que quiere es enviar emails, pero no dispone de un servidor SMTP local, puede usar la configuración del servidor SMTP del proveedor de servicio de email. Por ejemplo, la siguiente configuración es válida para enviar correos electrónicos a través de los servidores de Gmail con una cuenta de Google:
Ejecute el comando python manage.py shell para abrir un intérprete de Python y enviar un email del siguiente modo:
La función send_mail() recoge el asunto, el mensaje, el remitente y una lista de los destinatarios como argumentos necesarios. Entre los argumentos opcionales existe fail_silently=False, que permite no elevar excepciones en caso de no poder mandar correctamente el email. Como salida se obtiene el número de emails enviados correctamente, por lo que si la salida obtenida es 1, entonces el email ha sido enviado.
Si envía emails con Gmail con la configuración anterior, hay que tener en cuenta activar el acceso para aplicaciones menos seguras en https://myaccount.google.com/lesssecureapps del siguiente modo:
Ahora, va a incorporar la funcionalidad dentro de la vista.
Para ello va a editar la vista post_share en el fichero views.py de la aplicación de blog:
Ha declarado una variable sent y la ha inicializado a True cuando el artículo se envía. Esta variable la usará más tarde para mostrar un mensaje en la plantilla, indicando que el formulario se ha enviado correctamente. Dada la necesidad de incluir en el correo un enlace al artículo, es necesario recuperar la ruta absoluta con el método get_absolute_url(). Se usa esta ruta como parámetro de entrada para request.build_absolute_uri(), construyendo una URL completa, incluyendo el esquema HTTP y nombre de dominio. Para construir el asunto y el cuerpo del mensaje se utilizan los datos procesados del formulario, una vez validado, y, por último, se envía el correo a la dirección estipulada en el campo to del formulario.
Ahora que la vista está completa, recuerde que es necesario añadir un nuevo patrón de URL. Para ello habrá que editar el fichero urls.py de la aplicación blog e incluir el patrón para la vista post_share:
Renderizar formularios en plantillas
Después de haber creado el formulario, programado la vista y añadido el patrón de URL, solo falta la plantilla de la vista. Para ello va a crear un nuevo fichero dentro de la ruta blog/templates/blog/post/ llamado share.html con el siguiente contenido:
Esta es la plantilla encargada de mostrar el formulario o un mensaje en caso de haber podido mandar el email. Como se puede observar, ha creado el elemento de formulario para que sea enviado por el método POST:
Después, le sigue la instancia del formulario. Le indicará a Django que renderice los campos en HTML con modo párrafo, es decir, con elementos <p> a través del método as_p. También puede mostrar el formulario como una lista de elementos utilizando as_ul, o como una tabla, a través del método as_table. Si quiere renderizar cada campo, puede iterar sobre cada uno de ellos del siguiente modo:
La etiqueta de plantilla {% csrf_token %} introduce un campo oculto con un token autogenerado para evitar ataques de tipo Cross-Site Request Forgery (CSRF). Este ataque consiste en un programa o sitio web malicioso realizando acciones no deseadas en nombre de un usuario en su sitio web. Se puede obtener más información en https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF).
La etiqueta mencionada genera un campo oculto con un código similar al siguiente:
Va a modificar la plantilla blog/post/detail.html y añadir el siguiente link para compartir la URL del artículo después de la variable {{ post.body | linebreaks }}:
Es necesario recordar que está construyendo URLs de forma dinámica usando la etiqueta {% url %} ofrecida por Django. Está utilizando el espacio de nombres blog y la URL post_share, y se pasa como parámetro el identificador del artículo para conformar la URL completa.