Uso Ajax para actualizar una lista de objetos, digamos cada vez que se hace clic en un botón. Pero quiero usar etiquetas de plantilla de Django para generar cada elemento de la lista. El problema es que tengo que enviar un JsonResponse
a JavaScript, pero allí no puedo usar estas etiquetas.
Tengo que enviar atributos de objeto como json. y estoy atascado con html simple en Ajax:
... success: function (json) { if (json.new_messages.length) { for (let m of json.new_messages) { $('#messages-list').append("<li>"+m.sender_name+" "+m.content+"</li>"); } } },
Una forma que encontré para resolver este problema es renderizar la plantilla primero y luego enviar el texto resultante como respuesta.
En un archivo de plantilla, solo incluya el html que debe usarse en Ajax. Sin etiquetas html adicionales. Aquí puede usar todas las etiquetas y filtros de Django. Por ejemplo:
{% for m in messages_list %} <li> <b>{{ m.sender.profile.get_short_name }}</b> ({{ m.send_time|time:"H:i" }}): {{ m.content }} {% if m.sender == user %} {% if m.is_seen %} <b><small>✓✓</small></b> {% else %} <b><small>✓</small></b> {% endif %} {% endif %} </li> {% empty %} <li>No messages here yet...</li> {% endfor %}
En la vista, usando una función llamada render_to_string
, represente la plantilla y envíela en el contexto de la respuesta json:
response = render_to_string("just_list.html", context={"messages_list": new_messages}) return JsonResponse({"messages": response})
Entonces se puede usar fácilmente en Ajax:
... success: function (json) { $('#messages-list').append(json.messages); },