¿Cómo muestro un alert en función de lo que HttpResponse me devuelva en Django?

publicado por: Anonymous

En mi proyecto estoy haciendo un formulario de contacto y quiero que al enviarlo se reciba una alerta confirmando el envío.

Mi código es el siguiente:

if 'contactButton' in request.POST:
    if contact_name and contact_email and contact_subject and contact_message:
        try:
            send_mail(contact_subject, contact_name+" ha escrito desde el formulario de contacto.nEmail: "+contact_email+"nAsunto: "+contact_subject+"nMensaje: "+contact_message, contact_email,[mi_mail], fail_silently=False)
        except Exception as e:
            return HttpResponse('Invalid header found. ')
        return redirect('home')
    else:
        return HttpResponse('Make sure all fields are entered and valid.')

Ahora, al enviar el formulario se redirige a la pantalla principal sin ningún tipo de alerta, pero si el formulario no ha sido enviado correctamente, se muestra una página en blanco con el mensaje.

La solución que busco no puede ser utilizar otro sistema al que utilizo, o crearme un HTML personalizado y devolverlo, porque solucionar este problema me soluciona otros idénticos, por eso necesito poder generar una alerta como he comentado.

solución

Lo que necesitas usar es el messages framework. Lo primero que tienes que hacer es asegurarte que los mensajes estén habilitados. Luego puedes usarlos en tus vistas:

from django.contrib import messages


def vista(..):
    # ...
    messages.debug(request, '%s sentencias SQL fueron ejecutadas.' % count)
    messages.info(request, 'Quedan 3 créditos en tu cuenta.')
    messages.success(request, 'Tu perfil ha sido actualizado.')
    messages.warning(request, 'Tu cuenta expira en 3 días.')
    messages.error(request, 'Ocurrió un error al tratar de eliminar el archivo.')
    # ...

Como ves, existen varios niveles. Cada nivel se representa de manera distinta en las clases HTML (error usa rojo, warning usa naranja, etc.).

Para usarlos en tu vista lo único que tendrías que hacer es crear el mensaje antes de la redirección, luego los muestras en el template:

try:
    send_mail(...)
    messages.success(request, 'Correo enviado con éxito.')
except Exception as e:
    messages.error(request, 'Ocurrió un error al enviar el correo.')
return redirect('home')

Para mostrarlo en tu template:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>    
{% endif %}

El messages lo pasa Django automaticamene a tu request cada vez que agregas un mensaje en tu vista.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *