Te recomendamos que revises esta respuesta en un ambiente controlado antes de pasarlo a producción, un saludo.
Solución:
Estas son las herramientas/métodos que me ayudaron a resolver el problema. Primero, tengo un método de utilidad auxiliar llamado render_to_json
:
# `data` is a python dictionary
def render_to_json(request, data):
return HttpResponse(
json.dumps(data, ensure_ascii=False),
mimetype=request.is_ajax() and "application/json" or "text/html"
)
tengo un messages.html
plantilla para representar el html necesario para los mensajes emergentes:
% for message in messages %
% endfor %
Cuando creo un mensaje en respuesta a una solicitud de AJAX, uso Django render_to_string
para empaquetar el(los) mensaje(s) en un string que se almacena en un data
diccionario, que luego usa mi render_to_json
para devolver una respuesta apropiada:
def my_custom_view(request)
# ... your view code
data =
'msg': render_to_string('messages.html', , RequestContext(request)),
return render_to_json(request, data)
Luego, en mi jQuery $.post(...)
función de devolución de llamada, verifico si el response
objeto tiene un msg
attributey, a continuación, inserte el contenido de response.msg
en el DOM donde quiero que esté, con transiciones jQuery si lo desea. Mi base.html
plantilla contiene la
- contenedor para los mensajes:
% include 'messages.html' %
Tenga en cuenta que lo anterior incluye la messages.html
para el caso en que desea mostrar mensajes en una carga de página real (solicitud no AJAX): está en blanco si no hay mensajes, pero el
- todavía está disponible para enviar mensajes recibidos con AJAX.
La última pieza es la función Javascript (requiere jQuery) que uso en cualquier $.post(...)
devoluciones de llamada para mostrar los mensajes:
function showPopupMessage(content)
var elMessages = $('#popup-messages-content');
if (elMessages.length && content)
elMessages.html(content);
Encontré una manera más fácil de hacerlo aquí, tomé algunas de esas ideas y este fue mi resultado:
Simplemente creas tus mensajes como siempre y antes de enviar la respuesta los pones en una lista de dictados:
django_messages = []
for message in messages.get_messages(request):
django_messages.append(
"level": message.level,
"message": message.message,
"extra_tags": message.tags,
)
Luego agrega cualquier dato y sus mensajes y los serializa, por ejemplo:
data =
data['success'] = success
data['messages'] = django_messages
return HttpResponse(simplejson.dumps(data), content_type="application/json")
Finalmente en tu ajax:
success: function(data)
success = data.success;
update_messages(data.messages);
if (success)
...
,
Y la función update_messages:
function update_messages(messages)
$("#div_messages").html("");
$.each(messages, function (i, m)
$("#div_messages").append(""+m.message+"");
);
Funciona perfectamente y me resultó muy fácil de implementar.
Aquí hay una idea simple.
Agregue un marcador de posición para sus mensajes en layout.html, esto permite agregar nuevos mensajes en javascript:
% for message in messages %
message
% endfor %
En lugar de:
% for message in messages %
message
% endfor %
En add.html, agregue otro me gusta:
% if messages %
% endif %
Y ajaxForm se vería así:
$('#your_form_id').ajaxForm(
success: function(responseText)
var newMessages = $(responseText).find('.hidden-messages').html();
$('#messages').append(newMessages);
,
);
Tienes la posibilidad dar difusión a esta noticia si te ayudó.