我是Django的新手。我正在尝试实现数据表服务器端处理。我已经在我的models.py,views.py和urls.py写了一些代码,也遵循了Datatables的官方文档。但不幸的是,我的终端出现了错误,无法找到修复它的方法。
这里是,模特.py
from django.db import models
class Products(models.Model):
title = models.CharField(max_length=100, blank=True)
description = models.TextField(blank=True)
price = models.IntegerField(blank=True, null=True)
def __str__(self):
return self.title
查看次数.py
from django.shortcuts import render
from ajax_crud.models import Products
from django.http import JsonResponse
def product_json(request):
products_json = Products.objects.all().values('title', 'description', 'price')
data = list(products_json)
value = JsonResponse(data, safe=False)
print(value)
return value
网址.py
from django.urls import path
from ajax_crud.views import product_json
urlpatterns = [
path('json/',product_json,name='json'),
]
演示数据表.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
</head>
<body>
<h1>List of Products</h1>
<hr>
<table id="demo-table">
<thead>
<tr>
<th>title</th>
<th>description</th>
<th>price</th>
</tr>
</thead>
<tbody></tbody>
</table>
<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script>
$(document).ready(function() {
$('#demo-table').DataTable( {
"processing":true,
"serverSide": true,
"ajax": {
"type" : "GET",
"url": "{% url 'json' %}",
"dataSrc": "objects"
},
"columns": [
{ "data": "title" },
{ "data": "description" },
{ "data": "price" },
]
} );
} );
</script>
</body>
</html>
我的终端错误。
[03/Sep/2020 05:31:49] "GET /json/?draw=1&columns%5B0%5D%5Bdata%5D=title&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=description&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=price&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=&search%5Bregex%5D=false&_=1599111109862 HTTP/1.1" 200 97
请有人帮我摆脱它。帮助将不胜感激。
2条答案
按热度按时间gzjq41n41#
我建议分两步来完成:
1.显示基本数据(就像您没有使用服务器端处理一样)。
1.添加特定的服务器端逻辑。
背景
我将假设您的应用程序正确地处理HTML模板,并在以下表达式中构建有效的URL:
{% url 'json' %}
.我还将假设从 AJAX 请求发送到HTML页面的响应如下所示(即您提供的确切JSON数据):
如果这两个假设中有一个是错误的,那么下面的内容可能不会有帮助。
(You可以使用浏览器的控制台检查是否在网页中接收到JSON数据响应。按F12打开浏览器控制台并检查“Network”(网络)选项卡。)
步骤1
在此步骤中,我们将继续使用
"serverSide": true
-因此,不要删除它。您的DataTable定义包括以下行:
这意味着DataTables将在JSON中查找使用该名称的对象,但是没有名为
objects
的对象-因此没有找到数据。因此,您需要从模板中删除该行。
但是因为您使用的是
"serverSide": true
,所以还需要进行更多的更改。看看我在评论中提到的链接(这个),它描述了当你响应 AJAX 请求时需要从服务器传递到DataTables的JSON数据,在同一页上也有一个例子(这里)。
因此,我们可以获取JSON并使其符合该要求:
根据服务器端处理的需要,我们已经将您的数据 Package 在一些附加数据中。您的数据现在位于一个名为
data
的对象中-DataTables希望在此找到它,以填充表的行。因此,我们不需要在此处使用"dataSrc": "data"
-因为data
是默认(预期)值。在上面的例子中我使用了
1
,1000
和1000
的值--只是为了测试。你可以使用这些值--然后我们将在下面的步骤2中修复它们。因此您需要更改Django逻辑,以便它构建上面的JSON并将其返回给DataTables。
第二步
通常(不使用服务器端处理时),服务器会将其所有数据一次发送到DataTables。DataTables处理分页、筛选和排序的所有逻辑。
但是现在,有了服务器端处理,你的Django代码将负责所有的工作,它不会发送所有的数据,一次只发送一个小子集,这就是服务器端处理的力量:您不必将所有1,000,000条记录都发送到浏览器(这会使浏览器崩溃),而只需为每个请求发送一个小的、快速的子集。
为此,Django需要从DataTables读取请求,无论用户何时移动到新页面,或执行排序操作,或过滤数据,DataTables都会自动发送请求。
以下就是您在问题中提出的一项要求:
我手动URL-decoded请求,使其更易于阅读。
这个请求包含Django构建所需响应所需的所有信息。
例如:
这告诉您需要在响应中提供10条记录-这将是前10条记录(第1页的索引为0)。
还有这个
这告诉您需要按列0(第一列-
title
)以升序对数据进行排序。请参阅此处了解全部详细信息。
因此,您需要在Django应用程序中编写所有这些逻辑-读取请求,然后实现其中包含的指令,以构建正确的响应。
kpbwa7wx2#
您试用过这个套餐吗?https://pypi.org/project/datatables-server-side-django/
我已经使用该包实现了datatables服务器端方法