如何将字典对象的javascript列表发送到django ajax

Posted

技术标签:

【中文标题】如何将字典对象的javascript列表发送到django ajax【英文标题】:How to send the javascript list of dictionaries object to django ajax 【发布时间】:2014-11-09 20:24:38 【问题描述】:

我有这样的模板

<a href="javascript:;" onclick="AddPropety();" >Submit </a>


function AddPropety()
  var list = ['name':'parrot','color':'green','name':'dog','color':'brown',etc...];
  var formData = new FormData($('#submit_form')[0]);
  formData.append("list", list);
  $.ajax(
    url: "% url 'add_details' %",
    type: 'POST',
    data: formData,
    async: true,
    cache: false,
    contentType: false,
    processData: false,


  );// end of $.ajax

  return false;


和下面显示的ajax

def add_details(request):
    response_data = 
    if request.is_ajax():

        lists = request.POST.get('list')
        print lists
        for list in lists:  
            print list
        response_data['status'] = "success"

    else:
        response_data['status'] = "Error"

    return HttpResponse(json.dumps(response_data), content_type='application/json')

在运行此代码时,我得到了对象之类的值。如何获取字典或字典列表等值

提前谢谢..

【问题讨论】:

请求对象只返回对象,看这个问题:link 【参考方案1】:
var arr = ["a","b",,,"e"];
var json_string = JSON.stringify(arr);

.

   json_string = '['name':'parrot','color':'green','name':'dog','color':'brown',etc...]'  # passed from JavaScrip    try:
   import simplejson as json
   result = json.loads(json_string)

【讨论】:

【参考方案2】:

Javascript

function AddPropety()
  var list = ['name':'parrot','color':'green','name':'dog','color':'brown',etc...];
  var formData = new FormData($('#submit_form')[0]);

  formData.append("list", JSON.stringify(list));

  $.ajax(
    url: "% url 'add_details' %",
    type: 'POST',
    data: formData,
    async: true,
    cache: false,
    contentType: false,
    processData: false,


  );// end of $.ajax

  return false;


ajax.py

def add_details(request):
    response_data = 
    if request.is_ajax():

        lists = request.POST.get('list')
        jd = json.dumps(lists)
        list = eval(json.loads(jd))
        print lists
        for list in lists:  
            print list
        response_data['status'] = "success"

    else:
        response_data['status'] = "Error"

    return HttpResponse(json.dumps(response_data), content_type='application/json')

【讨论】:

这个答案对我有用。关键是eval(json.loads(json.dumps(list_of_dicts))) 以一种可用的方式提取字典列表 注意:当我没有使用formData 在前端发送数据并附加一个隐藏的&lt;input&gt; 时,不需要json.dumpsjson.loads 的组合(并且确实没有给出正确的结果)。服务器端只需要json.loads【参考方案3】:

只需使用 getlist

lists = request.POST.getlist('list')

【讨论】:

【参考方案4】:

在 js 中你必须对你的数组进行字符串化:

let arr = ["foo1": bar1, "foo2": bar2]
let data = "data": JSON.stringify(arr)
$.ajax(
    url: url,
    method: 'POST',
    headers: "X-CSRFToken": variables.csrfToken,
    data,
)

在 views.py 中,如果使用通用视图,您可以覆盖 create 方法:

import json
from rest_framework.generics import CreateAPIView

class MyCreateAPIView(CreateAPIView):
    serializer_class = MySerializer

    def create(self, request, *args, **kwargs):
        """
        checks if post request data exists initializes serializer with many=True
        else executes default CreateModelMixin.create method
        """

        json_string_data = request.data.get('data', False)

        if not json_string_data:
            return super(MyCreateAPIView, self).create(request, *args, **kwargs)
        else:
            json_data = json.loads(json_string_data)
            serializer = self.get_serializer(data=json_data, many=True)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

【讨论】:

以上是关于如何将字典对象的javascript列表发送到django ajax的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:如何遍历模型中的对象列表

Asp.net 如何将列表从代码隐藏发送到 javascript 以在 googlemap 中显示坐标

如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript

如何将 JavaScript 对象/数组发送到前端 - node.js 应用程序

SignalR如何将javascript对象从一个客户端发送到另一个客户端

如何在 FastAPI 中将字典列表作为 Body 参数发送?