Javascript 表排序器AJAX分页。如何与后端JSON正确交互?
试着让我的一些桌子能用 实际上,只使用一个表创建了一个干净的空模板。只是为了测试Javascript 表排序器AJAX分页。如何与后端JSON正确交互?,javascript,jquery,django,ajax,tablesorter,Javascript,Jquery,Django,Ajax,Tablesorter,试着让我的一些桌子能用 实际上,只使用一个表创建了一个干净的空模板。只是为了测试 {% extends 'base.html' %} {% load static %} {% block title %} TEST Skaters averages - NHL stats tracker {% endblock title %} {% block styles %} <link rel="stylesheet" href="{% static 'players/tablesor
{% extends 'base.html' %}
{% load static %}
{% block title %}
TEST Skaters averages - NHL stats tracker
{% endblock title %}
{% block styles %}
<link rel="stylesheet" href="{% static 'players/tablesorter.css' %}">
{% endblock styles %}
{% block content %}
<!-- SKATERS -->
<table class="tablesorter">
<thead>
<tr class="tablesorter-ignoreRow">
<td class="pager" colspan="5">
<button type="button" class="btn first"><i class="small material-icons">first_page</i></button>
<button type="button" class="btn prev"><i class="small material-icons">navigate_before</i></button>
<span class="pagedisplay"></span>
<button type="button" class="btn next"><i class="small material-icons white">navigate_next</i></button>
<button type="button" class="btn last"><i class="small material-icons">last_page</i></button>
<select class="pagesize">
<option value="25">25</option>
</select>
</td>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
</thead>
<tbody>
</tbody>
</table>
{% endblock content %}
{% block scripts %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/js/jquery.tablesorter.js"></script>
<!-- Widgets -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/js/jquery.tablesorter.widgets.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/js/extras/jquery.tablesorter.pager.min.js"></script>
<script src="{% static 'players/sorting_averages.js' %}"></script>
{% endblock scripts %}
在players.views中,我为每个页面制作带有JSON数据的片段
def skaters_averages_json(request, page):
start = utils.PAGE_SIZE_2*(page - 1)
end = start + utils.PAGE_SIZE_2
skaters = Skater.objects.select_related('team')
one_page_slice = skaters.order_by('-points', 'games', '-goals')[start:end]
skaters_json = json.loads(serializers.serialize('json', one_page_slice))
data = {}
data["total_rows"] = utils.PAGE_SIZE_2
data["headers"] = ["ID", "Name", "Points"]
data["rows"] = []
for index, skater in enumerate(skaters_json):
data["rows"].append({})
data["rows"][index][data["headers"][0]] = skater['fields']['nhl_id']
data["rows"][index][data["headers"][1]] = skater['fields']['name']
data["rows"][index][data["headers"][2]] = skater['fields']['points']
return JsonResponse(data, safe=False)
url.py
urlpatterns = [
path('skaters_averages_json/<int:page>', views.skaters_averages_json,
name='skaters_averages_json'),
]
正如我在上面链接的文档中所读到的,现在ajaxProcessing是不必要的
返回的对象
在v2.11中,ajaxProcessing可以直接返回上述对象
或者甚至不用设置ajaxProcessing函数。
因此,如果ajaxProcessing函数返回一个对象,那么数据
存储在table.config.pager.ajaxData中
在我看来,我误解了如何在.tableSorterPage中传递页码参数。尝试了几种不同的方法。现在,我希望表格显示初始加载的第一页。然后使用AJAX来回分页。现在它只加载表的标题。不是来自JSON的头。在这种情况下,您需要包含一个 如果您想完全省去ajaxProcessing函数,那么期望从服务器获得的JSON应该看起来像是JSON中不允许使用以下注释:
{
total: 100,
filteredRows: 100, // needed if using the filter widget
headers: [...], // optional
rows: [...]
}
还是这个
[
100, // total
[
[ "row1cell1", "row1cell2", ... "row1cellN" ],
[ "row2cell1", "row2cell2", ... "row2cellN" ],
...
[ "rowNcell1", "rowNcell2", ... "rowNcellN" ]
],
[ "header1", "header2", ... "headerN" ] // optional
]
@莫蒂给出了一个很好的回答。我想在我的代码中添加一些错误的东西 在我的players.views中,我不希望得到参数“page”的值=0。 我忘记了tablesorter的行索引从0开始。然后,当pager使用page=0进行AJAX调用时,变量start等于-25。这显然是错误的。带有utils。页面大小2=25开始=25*0-1。如果page=1,则它的start=0。所以我刚刚用page+1替换了page,它可以正常工作 此tablesorter初始化中的分号导致了SyntaxError:expected表达式get'.'因此无法执行此文件中的任何内容。去掉分号后,它就可以工作了 $table.tablesorter{ };
我刚刚意识到在排序_averages.js中有一个额外的分号$table.tablesorter{};。tablesorter甚至没有初始化。表体仅包含500个内部服务器错误。我需要自己编写一个合适的AJAX成功处理程序吗?或者,这只适用于ajaxUrl?此外,console.log会在THEAD中打印无效或列数不正确的消息;应该是3列,但找到了5列jquery.tablesorter.js:2357:13当我在HTML中向表中添加两个th时,没有这样的错误。不确定它最初在哪里找到了5列。要回答我自己的问题,我应该使用属性。但是如果我没有弄错的话,没有它的交互应该是有效的。*我刚刚意识到
{
total: 100,
filteredRows: 100, // needed if using the filter widget
headers: [...], // optional
rows: [...]
}
[
100, // total
[
[ "row1cell1", "row1cell2", ... "row1cellN" ],
[ "row2cell1", "row2cell2", ... "row2cellN" ],
...
[ "rowNcell1", "rowNcell2", ... "rowNcellN" ]
],
[ "header1", "header2", ... "headerN" ] // optional
]