Trying to display a table with Django restframework + Datatables, getting 500 Internal Server Error with Ajax

问题描述 投票:0回答:1

error page

嗨,当我尝试在我的网站上显示表格时,图像中出现此 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'来自哪里......

python django ajax django-rest-framework datatables
1个回答
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]=

然后您可以使用该新信息来更轻松地处理请求。

© www.soinside.com 2019 - 2024. All rights reserved.