嗨,当我尝试在我的网站上显示表格时,图像中出现此 Ajax 错误。
我已将路由器及其网址添加到我的网址文件中。这是我的其他文件。
模型.py:
class Sites(models.Model):
site_id = models.IntegerField(primary_key=True)
site_name = models.CharField(max_length=20)
site_description = models.TextField()
class Meta:
managed = False
db_table = 'sites'
views.py:
class SitesViewSet(viewsets.ModelViewSet):
queryset = Sites.objects.all()
serializer_class = SitesViewSerializer
序列化程序.py:
class SitesViewSerializer(serializers.ModelSerializer):
class Meta:
model = Sites
fields = ('site_id', 'site_name', 'site_description')
这是我的完整回溯。
[02/May/2023 07:01:22] "GET /sites-directory HTTP/1.1" 200 10906
Internal Server Error: /api/sites/
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/mixins.py", line 38, in list
queryset = self.filter_queryset(self.get_queryset())
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework/generics.py", line 150, in filter_queryset
queryset = backend().filter_queryset(self.request, queryset, self)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/rest_framework_datatables/filters.py", line 95, in filter_queryset
queryset = queryset.order_by(*ordering)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/db/models/query.py", line 1134, in order_by
obj.query.add_ordering(*field_names)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1919, in add_ordering
self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1481, in names_to_path
raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword '0' into field. Choices are: site_description, site_id, site_name
[02/May/2023 07:01:24] "GET /api/sites/?format=datatables&draw=1&columns%5B0%5D%5Bdata%5D=0&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=1&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=2&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&_=1683010883030 HTTP/1.1" 500 136681
我检查了我的模型,它们看起来不错。我不知道关键字'0'来自哪里......
您的 Django 应用程序正在尝试处理从您的 DataTable 发送的
GET
请求。
(您还没有向我们展示您的 DataTables 代码 - 但它似乎正在使用
serverSide: true
作为其选项之一。)
您可以在错误消息中看到请求(在您的问题中):
GET /api/sites/?format=datatables&draw=1&columns%5B0%5D%5Bdata%5D=0&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=1&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=2&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&_=1683010883030 HTTP/1.1" 500 136681
所以,这是一个 GET - 它因
500
内部服务器错误而失败。
请求有一个很大的查询参数字符串 - URL 中
/api/sites/?
后面的所有内容。根据 Ajax 请求,查询参数字符串是 URL 编码的。
如果我们对其进行 URL 解码,我们将得到以下内容:
(我添加了换行符以使其可读,并删除了将每个
&
对分开的每个key=value
):
format=datatables
draw=1
columns[0][data]=0
columns[0][name]=
columns[0][searchable]=true
columns[0][orderable]=true
columns[0][search][value]=
columns[0][search][regex]=false
columns[1][data]=1
columns[1][name]=
columns[1][searchable]=true
columns[1][orderable]=true
columns[1][search][value]=
columns[1][search][regex]=false
columns[2][data]=2
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
_=1683010883030
此请求由 DataTables 自动生成,并在 (a) 您的 DataTable 首次初始化时发送到您的服务器,然后 (b) 每当用户执行筛选、搜索或页面导航操作时再次发送。
您的应用程序需要处理此查询参数字符串,并使用其中的信息构建正确的数据集,以在其响应中发送回 DataTable。该数据将包含 DataTable 的一页数据。
仔细观察请求,我们发现它包括:
start=0
length=10
order[0][column]=0
order[0][dir]=asc
这意味着从第 0 行(第一行)开始并提供 10 行数据(结果的第一页)。
它还告诉您如何构建结果的“第一页”,告诉您整个数据集需要按第 0 列(第一列)升序排序。
您的应用程序未读取任何此类信息。相反,它假设请求参数的结构完全不同。
您可以在官方文档中看到所有这些描述。请参阅“发送参数”。
还请注意,从 Django 发回 DataTables 的响应必须与同一链接中描述的预期 JSON 结构相匹配。请参阅“返回的数据”。
关于错误:
无法将关键字“0”解析为字段。选项有:site_description、site_id、site_name
此时我不确定应用程序正在尝试读取哪个查询字符串归零 - 但这是错误的来源。
还可以看到请求参数不包含
site_description
、site_id
、site_name
的任何字段。
DataTables 提供了一个通用结构,其中使用索引引用列:
columns[0]
、columns[1]
等等。
name
选项。然后,请求将显示如下内容:
columns[0][name]=site_id
而不是你目前看到的,这是:
columns[0][name]=
然后您可以使用该新信息来更轻松地处理请求。