我使用Ajax更新对象列表,比如说每次单击按钮时。但我想使用Django模板标记来生成列表中的每一项。问题是,我必须将JsonResponse
发送回JavaScript,但在那里,我不能使用这些标记。
我必须以json的形式发送对象属性。我在Ajax中被纯html卡住了:
...
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>");
}
}
},
我发现解决这个问题的一种方法是首先呈现模板,然后发送结果文本作为响应。
在模板文件中,只包含Ajax中需要使用的html。没有额外的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);
},