【问题标题】:jQuery POST not returning variable usersjQuery POST 不返回变量用户
【发布时间】:2013-08-04 14:01:58
【问题描述】:

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

View.py

def get_data(请求):

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

urls.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 功能。

谢谢

【问题讨论】:

    标签: jquery django jquery-post


    【解决方案1】:

    您的 JQuery $.post 函数没问题,问题是在 Django 视图中获取值。您正在发布一组值 - 要获取它们,您可以在 POST QueryDict 上使用 getlist() 函数。所以你的视图应该是这样的:

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

    请看:

    QueryDict.getlist(key, default)

    django - getlist()

    【讨论】:

    • 好吧,错误已被删除,但现在我在print selected_users 上得到None
    • 它打印一个空列表
    • 我已经尝试过您的代码,它实际上发布了复选框值,请使用 DevTools 检查您的 POST 请求,并在“网络”选项卡中查看实际的请求内容。
    • 用您在问题中编写的原始 jquery 代码试试这个。
    • 嗯,我试过了,但我无法获得输出。我使用了 console.log(selected_users),它确实显示了复选框列表,但我无法将其提取到 views.py 文件中
    【解决方案2】:

    为什么不试试这样的 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)
    

    【讨论】:

    • 只是为了让数组中变量的存储更清晰,没有其他目的.. :)
    • 我按照@yuriy 的说法编辑了我的views.py 并尝试了你的jQuery 语句,但是它打印了一个空列表。知道为什么吗?
    • 您可以使用 console.log(selected_users) 并检查您是否没有发送空数组吗?我希望你已经这样做了?
    • 不,我之前没有这样做过。但是,在提交按钮后,它不会在控制台中打印任何内容。
    • 好吧,现在我可以得到 console.log 输出了。但仍然无法发布数据。 :(
    【解决方案3】:

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

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

    $(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);
    });
    

    【讨论】:

    • 嗯,这两种方法我都试过了。在第一个中,它说403-forbidden csrf termination 而第二个不起作用。我只是得到一个空列表,尽管 console.log 显示了传递的参数。知道有什么问题吗?
    • 在 chrome 中的开发者工具的网络选项卡中检查请求。并查看参数和标题的样子
    • 参数类似于["1","2"]。
    • 我想在后端获取这些参数作为列表。
    • 我无法在views.py 文件中获取发布的变量。
    【解决方案4】:

    您只需将@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);
            });   
        });    
    })
    

    views.py

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

    【讨论】:

    • 还有一个问题,为什么您将输入复选框放在表单之外?
    • 为了回答您的问题,复选框位于不同的 div 中。所以,我需要他们按照我的要求在表格之外。
    • 我得到一个空列表。有什么建议为什么?
    • 您确定您的网址正确吗?那里没有应用名称吗?关于您的复选框,即使它位于不同的 div 中,您也必须将其放在表单中
    • 嗨凯瑟琳,网址是正确的。请查看this link 并帮助我纠正它。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多