用django HttpResponse中的ajax替换正文内容的问题

时间:2018-10-31 11:45:30

标签: jquery ajax django

我使用Django作为服务器,并尝试使用ajax定期更新body标记中的内容。 Ajax部分看起来像这样:

<html>
<head>
<meta charset="utf-8">
<title>A Pyecharts Demo</title>
{% for jsfile_name in script_list %}
    <script src="{{ host }}/{{ jsfile_name }}.js"></script>
{% endfor %}
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>

<script>
setInterval(function() {
$.ajax({
     url:"/first_pyecharts/",
     type:'POST',
     data:{ 'last_update':'{{ last_update }}', 'csrfmiddlewaretoken': '{{ csrf_token }}' },
     dataType: "html",
     success: function (html) {
        document.getElementById("body").innerHTML = html
    }
});
}, 10000);
</script>

<body id="body"> 
<!-- contents to be replaced -->
</body>

views.py中的相关代码:

if last_update is None:
    update_context(cur)
    template = loader.get_template('pyecharts.html')
    return HttpResponse(template.render(context, request))
elif latest > datetime.strptime(last_update, '%Y-%m-%d %H:%M:%S'):
    update_context(cur)
    template = loader.get_template('pyecharts.body.html')
    return HttpResponse(template.render(context, request))
else:
    template = loader.get_template('pyecharts.body.html')
    return HttpResponse(template.render(context, request))

服务器返回一个HttpResponse及其模板,该模板由先前存储的或基于从Ajax提交的“ last_update”的新上下文呈现。

在这里,模板“ pyecharts.html”是完整的页面,上面有“ html”,“ head”,“ script”和“ body”部分。 “ pyecharts.body.html”仅包含“正文”部分中的内容,该内容用于更新网页中的“正文”标签。

但是当ajax从Django获得响应时,它似乎已用响应替换了整个页面,并删除了网页的其余标签。

谁能请我告诉我我做错了什么?是因为模板同时包含上下文和请求吗?考兹,我发现渲染方法只带有来自Django文档的上下文。我不确定。

1 个答案:

答案 0 :(得分:0)

最好将动态内容保留在部分模板中。 创建一个部分html文件,并在其中保留动态内容。

使用render_to_string(),将数据发送到模板中

docker run -it -e animals="mouse,rat,kangaroo" image 

现在接收模板中的数据,并将其放入#dynamic_content中,就像您之前使用js一样。

from django.template.loader import render_to_string

def get_item(request):
    # your code
    if last_update is None:
        html = render_to_string('your_path_to_the_partial', {'context_variable': variable})
        return HttpResponse(html)
    .....