下面是我在html中使用的代码,用于发送一组用户ID(数字)。点击我发送数组的复选框(checkIds): -
var checkIds = []
$(document).on("click","#group_save",function(){
$("#candidate-data tr").each(function(index,rowhtml){
var checked= $('input[id="groups"]:checked',rowhtml).length;
checkIds = jQuery.unique(checkIds)
if (checked==1){
checkIds.push($('.hideMe',rowhtml).text());
}
});
alert(checkIds);
var jsonText = JSON.stringify(checkIds)
checkIds.length = 0;
var groupName = $('input:text[name="group_name"]').val();
alert(groupName)
$.ajax({
url: "{% url 'userinfo:groups' %}" + "?gname="+groupName,
type: "POST",
data:jsonText,
dataType: 'json',
success: function(){
notyfy({type: "success", layout: "topCenter", text: "Saved", timeout: 5000});
}
});
});
如何在我的观看中访问data:jsonText
。 py我这样做不起作用我必须将gname
(名称)与数组(jsonText
)id一起保存在两个表中Group和GroupMembers in groups table我必须保存组名(gname)并且在保存之后我必须得到保存的组对象的id以及userids数组(jsonText)必须保存在GroupMembers表中: -
def groups(request):
gname = request.GET.get('gname', None)
if request.method == 'POST':
Groups(name=gname).save()
usersV = request.POST.get('jsonText')
x = request.GET.get('id',None)
print x
if x != "0":
for users in usersV:
print users
GroupMembers(group_id=x,user_id=users).save()
return HttpResponse("Success")
else:
return HttpResponse("Error")
答案 0 :(得分:2)
这对我有用: -
var checkIds = [];
$(document).on("click","#group_save",function(){
$("#candidate-data tr").each(function(index,rowhtml){
var checked= $('input[id="groups"]:checked',rowhtml).length;
checkIds = jQuery.unique(checkIds)
if (checked==1){
checkIds.push($('.hideMe',rowhtml).text());
}
});
alert(checkIds);
var groupName = $('input:text[name="group_name"]').val();
alert(groupName);
$.ajax({
url: "{% url 'userinfo:groups' %}" + "?gname="+groupName+"&checkids="+checkIds,
type: "POST",
dataType: 'json',
traditional: true,
success: function(){
notyfy({type: "success", layout: "topCenter", text: "Saved", timeout: 5000});
}
});
checkIds.length = 0;
and on python/django side:-
views.py
def groups(request):
print request.GET.copy()
gname = request.GET.get('gname', None)
if request.method == 'POST':
g = Groups(name=gname)
g.save()
x = g.pk
userlist = request.GET.get('checkids')
for users in userlist:
print users
GroupMembers(group_id=x, user_id=users).save()
return HttpResponse("Success")
else:
return HttpResponse("Error")
答案 1 :(得分:1)
您应该可以使用以下内容:
var checkIds = [];
$(document).on("click","#group_save",function(){
$("#candidate-data tr").each(function(index,rowhtml){
var checked= $('input[id="groups"]:checked',rowhtml).length;
checkIds = jQuery.unique(checkIds)
if (checked==1){
checkIds.push($('.hideMe',rowhtml).text());
}
});
var groupName = $('input:text[name="group_name"]').val();
$.ajax({
url: "{% url 'userinfo:groups' %}",
type: "POST",
data: {
"gname": gname,
"checkids": checkIds.slice(0)
},
dataType: 'json',
traditional: true,
success: function(){
notyfy({
type: "success",
layout: "topCenter",
text: "Saved",
timeout: 5000
});
}
});
checkIds.length = 0;
});
然后在你的python一边使用:
request.POST.get('gname');
request.POST.getlist('checkids');
首先,jQuery会为您处理数据对象的转换,因此除非您向服务器发送非常特定的格式,否则不需要使用JSON.stringify
或其他任何内容对其进行预处理。通过设置traditional: true
,您要求jQuery使用以下格式转换数组参数:
checkids=value&checkids=value&checkids=value
而不是:
checkids[]=value&checkids[]=value&checkids[]=value
这很好地解释了here和here但是它的长短不一是python / django使用{{1}支持开箱即用的param序列化的“非方括号”形式}。
哦,.getlist()
(创建数组的副本)的原因只是因为你后来设置checkIds.slice(0)
而我头脑中的偏执告诉我,如果ajax调用触发在稍后的执行周期中,如果我使用直接引用而不是副本,则数组将为空。这是极不可能的,因为ajax调用应该在请求的那一刻被触发,但在处理黑盒子或像jQuery这样的库时,我总是小心翼翼......你应该不要害怕我的偏执狂并且很可能安全地使用:
checkIds.length = 0;
答案 2 :(得分:0)
jsonText
是您在js文件中用于描述JSON的变量的名称。它不是JSON结构中某些数据的键的名称。在下面的行中,将jsonText
替换为实际的密钥名称。
request.POST.get('jsonText')
答案 3 :(得分:0)
request.POST
dict用于表单编码值。你没有发送那些:你发送一个JSON blob。您可以使用request.body
获取该JSON,然后解析它以获取Python字典。
usersV = json.loads(request.body)