Django Ajax POST请求:内部服务器错误

时间:2018-08-01 08:34:32

标签: python jquery ajax django django-views

请注意,自从我最近开始以来,我是AJAX的入门者。
我正在使用Django 2.0和Python。
我试图以数组的形式返回不兼容选项的列表。

这是我的模特:

class Door(models.Model) :
    image = models.ImageField(upload_to=upload_location)
    color = models.ForeignKey(Color, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2, default='119.99')
    not_comp_options = models.ManyToManyField(Option)

这是我的js模板:

$.ajax({
    type: "POST",
    url: "/get_not_compat_options/" + door_id,
    data: "",
    dataType: 'json',
    success: function()
    {
        console.log(data.onct)
    } 
})

这是我的网址:

urlpatterns = [
    # Other url patterns
    path('get_not_compat_options', views.get_not_compat_options, name="get_not_compat_options")
]

这是我的观点:

def get_not_compat_options(request, door_id) :
    onct = []
    door = get_object_or_404(Door, id=door_id)
    not_compat_options = door.not_comp_options
    for option in not_comp_options.all() :
        onct.append(option.name)
    data.append({"onct": onct})
    return JsonResponse(data)

很遗憾,在浏览器控制台中,我收到一条错误消息:500 (Internal Server Error)
PS:如果可以的话,我正在为服务器使用Nginx和gunicorn。

2 个答案:

答案 0 :(得分:3)

您正在呼叫data.append()而不先定义数据。

也许你想要

data = [{"onct": onct}]

data = {"onct": onct}

答案 1 :(得分:0)

这里有一些奇怪的事情:

  1. 您发出POST请求,但视图没有副作用,并且POST也不会传输任何数据。在这种情况下,GET更有意义;
  2. 基于success句柄,看起来结果应该是带有键onct的字典;和
  3. urls.py中的url不包含door_id参数。

通过在查询中使用.values_list(..),我们还可以节省一些数据库带宽,并进一步提高视图的美观度:

def get_not_compat_options(request, door_id):
    door = get_object_or_404(Door, id=door_id)
    not_compat_options = door.not_comp_options
    data = {'onct': list(not_comp_options.all().values_list('name', flat=True))}
    return JsonResponse(data)

,那么AJAX请求可能如下所示:

$.ajax({
    type: "GET",
    url: "/get_not_compat_options/" + door_id,
    data: "",
    dataType: 'json',
    success: function()
    {
        console.log(data.onct)
    } 
})

此外,urls.py寿星可能看起来像:

urlpatterns = [
    # Other url patterns
    path('get_not_compat_options/<int:door_id>', views.get_not_compat_options, name="get_not_compat_options")
]

否则,此path(..)无法接受door_id