使用 AJAX 刷新 Django 动态 HTML 表

Posted

技术标签:

【中文标题】使用 AJAX 刷新 Django 动态 HTML 表【英文标题】:Django dynamic HTML table refresh with AJAX 【发布时间】:2018-05-12 22:20:09 【问题描述】:

首先,我是 Django 新手,对 AJAX 和 jQuery 完全不熟悉。 我正在本地开发。

所以我试图实现一个 html 表格,它在 AJAX 的帮助下每 X 秒动态刷新(不刷新页面),但我似乎无法让我的代码工作。我已经使用了这个问题中提供的示例:https://***.com/a/34775420/6724882

(如果我有足够的代表,我会回答这个问题,或者通过聊天寻求帮助,但我还没有那种奢侈)

我已经尝试让它工作了 10 多个小时,但我开始感到无助。我一直在疯狂地搜索网络,但我被各种不同的方式弄得不知所措,而且每个问题和答案似乎都已经存在太多年了,或者与我的应用程序无关。

目前,该表在第一个查询中正常工作,它显示对象 Kala 与 rivinumero = 1(英文行号)。

所以,我有几个问题。

我应该将脚本包含在它自己的单独文件中,而不是包含在 HTML 文件(在我的例子中是 displaykala.html)。如果是这样,该文件应该是 在 static/js 文件夹中,还是在其他地方? 是否需要在某个地方单独包含 AJAX/JS 才能使脚本正常工作? 是我明显做错了什么,还是我提供的问题中的答案有误?

displaykala.html(与脚本在同一个文件中)

% load static %
% include 'loginbar.html' %
% include 'nav.html' %
<html>
    <head>
        <title>Display</title>
        <link rel="stylesheet" type="text/css" href="% get_static_prefix %css/style.css">
    </head>
    <body>
            <h1>Display</h1>
            <table id="_appendHere" class="table table-striped table-condensed">
                        <tr>
                          <th>Id</th>
                          <th>Nimi</th>
                          <th>Latnimi</th>
                        </tr>
                        % for kala in kalat %
                        <tr>
                          <td>kala.rivinro</td>
                          <td>kala.tuote</td>
                          <td>kala.latinalainen_nimi</td>
                        </tr>
                        % endfor %
                      </table>
    </body>
</html>

<script>
    var append_increment = 0;
    setInterval(function() 
        $.ajax(
            type: "GET",
            url: % 'get_more_tables.html' %,  // URL to your view that serves new info
            data: 'append_increment': append_increment
        )
        .done(function(response) 
            $('#_appendHere').append(response);
            append_increment += 10;
        );
    , 1000)
</script>

get_more_tables.html

% load static %
% for kala in kalat %
<tr>
   <td> kala.rivinro </td>
   <td> kala.tuote </td>
   <td> kala.latinalainen_nimi </td>
</tr>
% endfor %

views.py

from django.shortcuts import render
from adminside.models import Kala
from adminside.models import Liha
from django.contrib.auth.decorators import login_required
# Create your views here.

def index(request):
    return HttpResponse("Index")

@login_required
def displaykala(request):
    kalat = Kala.objects.filter(rivinro=1)
    return render(request, 'displaykala.html', 'kalat': kalat)

@login_required
def get_more_tables(request):
    increment = int(request.GET['increment'])
    increment_to = increment + 10
    kalat = Kala.objects.filter(rivinro=2)[increment:increment_to]
    return render(request, 'get_more_tables.html', 'kalat': kalat)

urls.py(应用文件夹中的一个)

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^displayk$', views.displaykala, name='displayk'),
    url(r'^get_more_tables', views.get_more_tables, name='get_more_tables'),
]

如果代码中有“是的,我试过这样做”这种愚蠢的实验,我很抱歉。

【问题讨论】:

抱歉,我不清楚实际出了什么问题。它更新一次然后停止,但您希望它每 10 秒附加一个新集合 - 对吗? @DanielRoseman 是的,丹尼尔。我想要完成的是,代码将首先显示第一个对象,然后在 X 秒后,将下一个对象附加到表中。在这种情况下,首先是属性为 rivinro 的对象,值为 1(有效),然后是下一个值为 2 的对象(此时什么都没有发生)。 你确定这是真正的代码吗? % url 'get_more_tables.html' % 应该会导致 NoReverseMatch 错误,因为 URL 模式仅称为“get_more_tables”而没有 .html(应该如此)。 是的,你发现了其中一个“我试过这个东西”的实验。你是对的,它产生了那个错误。目前,它不会产生错误,看起来像这样: % url 'get_more_tables' % 。但是,更新仍然不起作用。 浏览器工具网络标签显示什么?是只发出一个请求,还是有重复的请求导致错误,还是什么? 【参考方案1】:

非常感谢@DanielRoseman。 “您的 JS 将值作为 append_increment 发送,但 Python 正在尝试访问增量。-”

我将有问题的行更改为 increment = int(request.GET.get('append_increment')) 并修复了错误,现在表格正在动态更新。非常感谢您花费宝贵的时间。现在我可以继续构建应用了!

【讨论】:

你好,2年后,我偶然发现了类似的问题......我的问题是,你为什么要增加10?假设你在 db 中有 12 个东西,那就是 Kala 模型......你将先打印出 10 个,然后打印 2 个 .. 之后你需要等到你的 Kala 中有 20/21 个东西,然后你将只打印 1 个和不是其他 9 ...我在这方面是正确的还是我遗漏了什么?在此先感谢:) 您好!自从我从事那个项目以来已经有很长一段时间了,但是 IIRC 的信息应该打印在电视屏幕上,我们认为 10 Kala 的东西在屏幕上是相当多的东西,然后再切换到下一个“页”。这只是最终用户的可读性问题 :) 如果您认为我发布的代码中还有其他问题,那么很可能在我收到这里的解决方案后已修复。希望您找到解决问题的方法! :)

以上是关于使用 AJAX 刷新 Django 动态 HTML 表的主要内容,如果未能解决你的问题,请参考以下文章

Django使用Ajax实现页面无刷新评论回复功能

Django1.7+JQuery+Ajax集成小例子

js界面刷新&Django使用Ajax实现页面无刷新评论回复功能

django之ajax

django之ajax

Django的日常-AJAX