Проблема с заменой содержимого тела на ajax из django httpresponse

Я использую Django в качестве сервера и периодически пытаюсь обновлять содержимое тега body с помощью ajax. Часть 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 с шаблоном, отображаемым ранее сохраненным или новым контекстом на основе last_update, отправленного из ajax.

Здесь шаблон pyecharts.html - это полная страница с частями html, head, script и body, как показано выше. В то время как pyecharts.body.html содержит только содержимое в части body, которая используется для обновления тега body внутри веб-страницы.

Но когда ajax получает ответ от Django, кажется, что он заменил всю страницу ответом, удалив остальные теги веб-страницы.

Кто-нибудь может любезно сказать мне, где я сделал неправильно? Это потому, что шаблон отображается как с контекстом, так и с запросом? Coz Я нашел метод рендеринга с контекстом только из документов Django. Я не уверен.

скрипт не является отдельной частью страницы и не может стоять отдельно. Он должен находиться либо внутри головы, либо внутри тела.

Daniel Roseman 31.10.2018 13:47

@DanielRoseman Спасибо за совет, я перенес часть сценария в голову. Но я думаю, что сценарий действительно сработал, хотя он был размещен отдельно. Потому что он отправлял запрос POST каждые 10 секунд. Теперь я подозреваю, что javascripts из ответа не были выполнены должным образом, потому что ответ почти сформирован javascripts, сгенерированным pyecharts.

vaart joe 06.11.2018 09:44
1
2
237
1

Ответы 1

Лучше сохранить динамический контент в частичном шаблоне. Создайте частичный html-файл и сохраните там динамическое содержимое.

Используя render_to_string (), отправьте данные в шаблон следующим образом

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)
    .....

теперь получите данные в шаблоне и поместите их в #dynamic_content так же, как вы это делали ранее, используя js.

<body>
    <div id="dynamic_content"></div>
</body>    

Спасибо. Это то, что я пытался сделать. 'pyecharts.body.html' соответствует частичной части, как вы здесь заметили. Есть ли шанс, что javascripts из ответа не были выполнены должным образом? Ответ здесь в основном формируется javascript-скриптами, сгенерированными pyecharts.

vaart joe 06.11.2018 09:47

Другие вопросы по теме