Arrays 如何将字典对象的javascript列表发送到django ajax
我有这样的模板Arrays 如何将字典对象的javascript列表发送到django ajax,arrays,ajax,django,python-2.7,dictionary,Arrays,Ajax,Django,Python 2.7,Dictionary,我有这样的模板 <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]); fo
<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;
}
运行这段代码时,我会得到像object这样的值。如何获取字典或字典列表之类的值
提前感谢。只需使用getlist
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;
}
lists=request.POST.getlist('list'))
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')
在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)
请求对象只返回对象,请看这个问题:这个答案对我有用。关键是执行
eval(json.loads(json.dumps(list of dicts))
以可用的方式提取dicts列表注意:当我没有使用formData
在前端发送数据并附加一个隐藏的
时,不需要将json.dumps
和json.loads
组合起来(并且没有给出正确的结果)。服务器端只需要json.loads
。
let arr = [{"foo1": bar1}, {"foo2": bar2}]
let data = {"data": JSON.stringify(arr)}
$.ajax({
url: url,
method: 'POST',
headers: {"X-CSRFToken": variables.csrfToken},
data,
})
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)