Использование тегов шаблонов Django в ответ на ajax
Я использую Ajax для обновления списка объектов, скажем, при каждом нажатии на кнопку. Но я хочу использовать теги шаблона Django для создания каждого элемента списка. Проблема в том, что мне нужно отправить JsonResponse обратно в JavaScript, но там я не могу использовать эти теги.
Мне нужно отправить атрибуты объекта как json. и я застрял с обычным html в 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>");
}
}
},
Один из способов, который я нашел для решения этой проблемы - это сначала отрисовать шаблон, а затем отправить полученный текст в ответ.
В файл шаблона включите только тот html, который должен быть использован в Ajax. Никаких лишних html-тегов. Здесь вы можете использовать все теги и фильтры Django. Например:
{% 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 %}
В представлении, используя функцию render_to_string, отрисуйте шаблон и отправьте его в контексте json-ответа:
response = render_to_string("just_list.html", context={"messages_list": new_messages})
return JsonResponse({"messages": response})
Тогда его можно легко использовать в Ajax:
...
success: function (json) {
$('#messages-list').append(json.messages);
},