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

Лучше сохранить динамический контент в частичном шаблоне. Создайте частичный 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.
скрипт не является отдельной частью страницы и не может стоять отдельно. Он должен находиться либо внутри головы, либо внутри тела.