Проблема с заменой содержимого тела на ajax из django HttpResponse - PullRequest
0 голосов
/ 31 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 31 октября 2018

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