问题:Django中的数据表服务器端处理



我对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

urls.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

请有人帮我摆脱它。我们将非常感谢您的帮助

我建议分两个步骤进行处理:

  1. 显示基本数据(就好像您没有使用服务器端处理一样(。

  2. 添加特定的服务器端逻辑。

背景

我假设您的应用程序正在正确处理HTML模板,并在以下表达式中构建一个有效的URL:{% url 'json' %}

我还假设从ajax请求发送到HTML页面的响应如下(即您提供的确切JSON数据(:

[{
"id": 1,
"title": "Neutrogena Oil-Free Acne Wash, 177ML",
"description": "Nice products",
"price": 300
}, {
"id": 2,
"title": "Product one hello2",
"description": "Notes",
"price": 400
}]

如果这两种假设中的任何一种都是错误的,那么下面的假设可能都无济于事。

(您可以使用浏览器控制台检查网页中是否收到JSON数据响应。打开浏览器控制台并检查"网络"选项卡是F12。(

步骤1

我们将继续使用"serverSide": true执行此步骤-因此,请执行而不是删除它。

您的DataTable定义包括以下行:

"dataSrc": "objects"

这意味着DataTables将在JSON中查找使用该名称的对象。但是没有名为objects的对象,因此没有找到任何数据。

因此,您需要从模板中删除该行

但是,因为您使用的是"serverSide": true,所以需要进行更多的更改。

看看我在评论中提到的链接(这个(。这描述了在响应ajax请求时需要从服务器传递到DataTables的JSON数据。同一页上还有一个例子(此处(。

因此,我们可以接受您的JSON并使其符合以下要求:

{
"draw": 1,
"recordsTotal": 1000,
"recordsFiltered": 1000,
"data": [{
"id": 1,
"title": "Neutrogena Oil-Free Acne Wash, 177ML",
"description": "Nice products",
"price": 300
}, {
"id": 2,
"title": "Product one hello2",
"description": "Notes",
"price": 400
}]
}

根据服务器端处理的需要,我们已经将您的数据封装在一些附加数据中。您的数据现在位于一个名为data的对象中,DataTables希望在该对象中查找数据,以填充表中的行。因此,我们不需要在这里使用"dataSrc": "data",因为data是默认值(期望值(。

在上面的示例中,我使用了110001000的值——仅用于测试。您可以使用这些值,然后我们将在下面的步骤2中修复它们。

因此,您需要更改Django逻辑,以便它构建上述JSON并将其返回到DataTables。

步骤2

通常(当您不使用服务器端处理时(,服务器会一次将其所有数据发送到DataTables。DataTables处理分页、筛选和排序的所有逻辑。

但现在,通过服务器端处理,Django代码将负责所有这些工作。它不会发送所有数据——一次只发送一个子集。这就是服务器端处理的功能:您不会将所有1000000条记录发送到浏览器(这会使浏览器崩溃(。您只为每个请求发送一个小的、快速的子集。

为此,Django需要从DataTables读取请求。每当用户移动到新页面、执行排序操作或筛选数据时,DataTables都会自动发送请求。

这里有一个这样的请求——你在问题中提供的请求:

draw=1
&columns[0][data]=title
&columns[0][name]=
&columns[0][searchable]=true
&columns[0][orderable]=true
&columns[0][search][value]=
&columns[0][search][regex]=false
&columns[1][data]=description
&columns[1][name]=
&columns[1][searchable]=true
&columns[1][orderable]=true
&columns[1][search][value]=
&columns[1][search][regex]=false
&columns[2][data]=price
&columns[2][name]=
&columns[2][searchable]=true
&columns[2][orderable]=true
&columns[2][search][value]=
&columns[2][search][regex]=false
&order[0][column]=0
&order[0][dir]=asc
&start=0
&length=10
&search[value]=
&search[regex]=false

我手动对请求进行URL解码,使其更易于阅读。

这个请求包含Django构建所需响应所需的所有信息。

例如:

start=0
length=10

这告诉您需要在响应中提供10条记录,这些记录将是前10条记录(第1页的索引为0(。

这个:

order[0][dir]=asc

这告诉您数据需要按第0列(第一列-title(升序排序。

有关详细信息,请参阅此处。

因此,您需要在Django应用程序中编写所有这些逻辑——读取请求,然后实现它所包含的指令,以构建正确的响应。

你试过这个包吗?https://pypi.org/project/datatables-server-side-django/

我已经使用该包来实现数据表服务器端方法

最新更新