首页 > 解决方案 > 使用 django 访问 ajax 元素

问题描述

我正在使用 ajax 获取 django 模型并获得结果

视图.py

def browse_jobs(request):
    keyword = request.GET.get('keyword', None)
    company = Company.objects.filter(title__icontains=keyword)
    data = serializers.serialize("json", company, fields=('title'))
    return JsonResponse({'data':data,})

ajax 请求

$.ajax({
    url: '/browse_jobs',
    data: {
      'keyword': keyword,
    },
    dataType: 'json',
    success: function (data) {
      if (data) {
        console.log(data.title);
      }
    }
});

我从 django 收到了这个回复

{"data": "[{\"model\": \"app.company\", \"pk\": 1, \"fields\": {\"title\": \"Facebook\"}}, {\"model\": \"app.company\", \"pk\": 2, \"fields\": {\"title\": \"Fabook\"}}]"}

我的问题是如何访问标题。

标签: javascriptjqueryajaxdjango

解决方案


您在这里对键的值进行了双重"data"序列化:首先由serializers.serialize(..)构造一个字符串,然后您再次对其进行序列化(构造一个字符串文字),这使得获取元素变得更加困难。

我们可以防止这种情况发生,例如首先将 JSON blob 转换回普通的Python对象:

from json import loads as json_loads

def browse_jobs(request):
    keyword = request.GET.get('keyword', None)
    company = Company.objects.filter(title__icontains=keyword)
    data = serializers.serialize("json", company, fields=('title'))
    return JsonResponse({'data': json_loads(data), })

然后 AJAX 调用将接收一个 JSON blob,其中"data"不映射到字符串,而是一个子字典列表,使其更易于访问。

您的查询有两个结果,您可以使用以下命令打印第一个 title结果:

$.ajax({
    url: '/browse_jobs',
    data: {
      'keyword': keyword,
    },
    dataType: 'json',
    success: function (data) {
        console.log(data.data[0].fields.title);
    }
});

推荐阅读