如何访问views.py python django中ajax调用中发送的数据

时间:2014-06-05 11:53:29

标签: jquery python ajax django

下面是我在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")

4 个答案:

答案 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

这很好地解释了herehere但是它的长短不一是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)