0

我正在尝试发布复选框的值,但无法这样做。它首先将所有选中的框收集在一个数组中( - 在使用函数selected_users对其进行测试时工作正常alert),然后将它们一起发送。但我无法发布数据。我得到的错误是 Key 'users' not found in 。我哪里错了?如何在 jQuery 插件中修改我的 POST 语句?

视图.py

def get_data(请求):

if request.method == 'POST': 
    selected_users = request.POST['users']
return HttpResponse(selected_users)

网址.py

urlpatterns = patterns('',
    url(r'get_data/','apps.api.views.get_data', name = 'grabhalo_get_data'),
)

jQuery

$(document).ready(function(){
                $('#submit').click(function() {
                  var selected_users = $('input[type=checkbox]:checked').map(function(_, el) {
                    return $(el).val();
                    }).get();
                    alert(selected_users);     // works fine
                    $.post("get_data/",{users:selected_users});   // not able to post
                });    
            })

复选框

{% for user in users %}
    <input type="checkbox" class="check" value="{{user.id}}" />{{user.name}}<br>    
{%endfor%}

    <form id="form" method="POST" action="/get_data/">
       {% csrf_token %}
       <input type="text" class="span8 search-query" placeholder="Type here..." name="chat">
       <input type="submit" value="Send" class = "btn btn-primary" id = "submit">
   </form>

如果有人可以重新定义 .post 功能,欢迎提出不同的建议。

谢谢

4

4 回答 4

1

您的 JQuery $.post 函数没问题,问题是在 Django 视图中获取值。您正在发布一组值 - 要获取它们,您可以使用getlist()POST QueryDict 上的函数。因此,您的视图将如下所示:

if request.method == 'POST':
    selected_users = request.POST.getlist('users[]')
    return HttpResponse(selected_users)

请参见:

QueryDict.getlist(键,默认)

django-getlist()

于 2013-08-04T14:05:03.767 回答
0

当您提交表单时,您需要阻止默认操作。否则,您的页面会刷新,从而使帖子无法发生。

还可以使用序列化数组将它们转换为数组。尝试这个

$(document).ready(function(){
     $('#submit').click(function(e) {
         e.preventDefault();
         // Will only serialize the checked values by default
         var selected_users = $('input[type=checkbox]').serializeArray();
          console.log(selected_users);     
          $.post("get_data/",{'users[]':selected_users}); 
     });    
})

$.ajax如果您想使用更多选项,则可以使用

$.ajax({
     url : 'get_data', 
     data : {'users[]' : selected_users},
     dataType: "set it to the type you are expecting".
     type : 'post'
}).done(function(data, status, xhr) {
   console.log(data)
}).fail(function(xhr, status, error) {
   console.log("Error status : "+ status + "-- error : " + error);
});
于 2013-08-04T22:29:49.857 回答
0

您只需将@Aditya 和@Yurly 答案结合起来:

脚本

function get_csrf_token(){
    return $("input[name='csrfmiddlewaretoken']").val();
}

$(document).ready(function(){
    $('#submit').click(function() {
        var datas = new Array();
        var i = 0;
        var csrf_token = get_csrf_token();

        $("input[type=checkbox]:checked").each(function() {
            datas[i] = $(this).val();
            i++;
        });   

        #make sure the url is correct
        $.post("get_data/", {'users[]': datas, 'csrfmiddlewaretoken': csrf_token}, function(data){
            alert(data);
        });   
    });    
})

视图.py

if request.method == 'POST':
    selected_users = request.POST.getlist('users[]')
    return HttpResponse(selected_users)
于 2013-08-04T14:57:58.990 回答
0

为什么不尝试这样的 POST:

$(document).ready(function(){
  $('#submit').click(function() {
      var selected_users=[];
      var $inputs = $('.check');
      $inputs.each(function() {         
            selected_users.push( $(this).val());        
        });            
                    alert(selected_users);     // works fine
      $.post("get_data/",{"users" : selected_users},function(response) 
        {
            alert(response);
        });     
            })

在你的 view.py 中试试这个:

if request.method == 'POST': 
selected_users = request.POST.get("selected_users", "")
return HttpResponse(selected_users)
于 2013-08-04T14:04:23.910 回答