example - django messages bootstrap
VisualizaciĆ³n retrasada del mensaje dentro de una etiqueta de inclusiĆ³n (2)
El marco de mensajería funciona a través de middleware, lo que necesita es una forma de informar la publicación en el mismo ciclo de solicitud / respuesta. Usted tiene la variable de contexto a mano, entonces ¿por qué no agregarle un valor?
if form.is_valid():
context[''success'']=True
else:
context[''success'']=False
Luego en tu plantilla:
{%if success %}<div>whoohoo!</div>{%endif%}
El siguiente problema está ocurriendo en un gran proyecto django. Pude replicar el problema en un pequeño proyecto de maquetas (código a continuación).
Estoy tratando de usar el marco de trabajo de mensajería django dentro de una etiqueta de inclusión para mostrar un mensaje cuando un formulario POST devuelve is_valid () . Este enfoque también se ha utilizado en otra respuesta aquí (ver la sección "actualización final").
El problema es que el mensaje no se muestra inmediatamente cuando la página se procesa después del POST. En su lugar, el mensaje aparece la próxima vez que navegue en otro lugar o actualice la página después de recibir la respuesta POST.
No estoy recibiendo ningún error. Todo parece estar funcionando normalmente, a excepción de la pantalla de mensaje demorado.
La razón de este enfoque es porque estoy reutilizando múltiples formas pequeñas en múltiples aplicaciones y necesito usar directores DRY para la lógica GET y POST. Este enfoque funciona perfectamente, ¡excepto por el problema con la visualización del mensaje de "éxito" retrasado!
Realmente aprecio cualquier comentario o asistencia!
EDITAR: para que quede claro, la línea que establece el mensaje está en ''my_template.py'':
messages.add_message(context[''request''], messages.SUCCESS, "Successfully added entry")
El proyecto de demostración:
settings.py:
...
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"django.core.context_processors.media",
"django.contrib.messages.context_processors.messages"
)
...
base_layout.html:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
{% for message in messages %}<div class="alert{% if message.tags %} alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>{% endfor %}
{% block content %}{% endblock %}
</body>
</html>
my_template.html:
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
forms.py:
from django.forms.models import ModelForm
from app.models import ContactMessage
class ContactForm(ModelForm):
class Meta:
model = ContactMessage
fields = [''name'']
index.html:
{% extends "app/base_layout.html" %}
{% load my_template %}
{% block content %}
{% my_template %}
{% endblock %}
my_template.py:
from django import template
from django.contrib import messages
from app.forms import ContactForm
register = template.Library()
@register.inclusion_tag(''app/my_template.html'', takes_context=True)
def my_template(context):
if context[''request''].method==''GET'':
return { ''form'':ContactForm() }
if context[''request''].method==''POST'':
form = ContactForm(context[''request''].POST)
if not form.is_valid():
return { ''form'': form }
form.save()
messages.add_message(context[''request''], messages.SUCCESS, "Successfully added entry")
return { ''form'':ContactForm() }
Según Django, los mensajes se ponen en cola para su renderizado hasta que el renderizador los borre. (referencia)
En su caso, está agregando mensajes después de que se hayan procesado las etiquetas {{ message }}
en base.html. De modo que su mensaje se almacena hasta su próxima vista cuando {{ message }}
en base.html se procesa nuevamente.
Para solucionar esto, puede mover sus etiquetas {{ message }}
detrás de {% endblock %}
del contenido. Otra posible solución es usar javascript para agregar etiquetas {{ message }}
desde my_template.html o desde end of base.html.