Как автоматически обновлять шаблоны в Django? - PullRequest
0 голосов
/ 22 апреля 2020

Предположим, у меня есть базовая c модель, подобная этой:

class Text(models.Model):
    msg = models.TextField()

Я отображаю шаблон как:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <h1>Messages<h2><br>
        {% for message in messages %}
            <a> {{forloop.counter}} - {{message}} <br>
        {% endfor %}
</body>
</html>

С соответствующими представлениями:

from django.shortcuts import render
from .models import Text

def home(request):
    context = {
        "messages": Text.objects.all(),
    }
    return render(request, 'app/home.html', context)

Предполагается, что я создаю новые объекты Text через страницу администратора. Если я сохраняю объект, я хочу отобразить его без обновления страницы. У меня нет хороших знаний о Javascript / jQuery / AJAX, но я знаю, что с помощью этого можно добиться успеха. Кто-нибудь может подсказать мне, как сделать содержимое без обновления страницы?

1 Ответ

0 голосов
/ 22 апреля 2020

В такой ситуации опрос - это первый вариант, который мне приходит в голову. Что вы делаете, это создаете представление, которое возвращает JsonResponse. Надеюсь, вы знаете, как вернуть объект набора запросов с помощью представления JsonResponse

. Прямо вперед, разрешите представлению возвращать Text.objects.all(), прежде чем вам нужно будет сделать сериализуемый объект запроса. Оптимизирующим образом вы можете проверить, действительно ли изменены записи модели (таблицы), если да, то отправить только измененные записи или все записи для простоты.

предположим, что у вас есть эта структура в html

<div>
        <h1>Messages<h2><br>
        <div id = "msg-block">
            <a></a>
        </div>
</div>

с точки зрения ajax, сделайте это

function update_messages(data){
     // suppose msg-block, is id of div enclosing all links, header div is sepreate
     str = ""
     for(var i = 0; i < data.length; i++){
         str += `<a> ${data[i]} </a>`
     }
    $("#msg-block").html(str)

}

setInterval(function() {
     $.ajax({
                type: "POST",
                url: "<url-to-json-view>",           
                data : {csrfmiddlewaretoken:document.getElementsByName('csrfmiddlewaretoken')[0].value},
                success: function(data)
                {
                    console.log("Success  : ", data)
                    // function to update the table
                    update_messages(data)
                },
                error: function(request, status, error)
                {
                    alert(request.responseText);
                }
            });  
}, time-interval-in-ms)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...