Django AJAX 请求仅获取最后一个元素(不是 getlist 问题)

Posted

技术标签:

【中文标题】Django AJAX 请求仅获取最后一个元素(不是 getlist 问题)【英文标题】:Django AJAX Request Only Getting Last Element (not getlist issue) 【发布时间】:2019-03-18 17:06:01 【问题描述】:

我正在尝试在 Django 中创建一个标记系统。基本上,我通过 AJAX 将标签列表(表单中的复选框)传递到 Django 视图,该视图将使用 httpresponse 中的相关标签的新选择来更新标签列表。

问题在于,即使在 getlist 之后,Django 似乎也只能自己接收列表的最后一个元素。事实上,如果我打印整个 request.GET,它只会在每个列表中显示一个元素。

javascript/jQuery 代码在这里:

    $(document).on('change', '.form-check-input',function () 

    var all_tags = $("input:checkbox").map(function()  return this.id; ).get();
    var selected_tags = $("input:checkbox:checked").map(function()  return this.id; ).get();

    alert(all_tags);
    alert(selected_tags);

    $.ajax(
        url: "% url 'AJAX_tagFilter' %",
        data:  'all_tags': all_tags, 'selected_tags': selected_tags ,
        cache: false,
        type: 'GET',
        success: function (data) 
            alert(selected_tags);
            $('#test').html(data);
            console.log('success');
        
    );

);

我做了几个警报,以便我可以看到每个阶段传递的内容是正确的。我看到了所有我希望看到的标签。

12,13,21,16,17,15,11,7,18
12,13

但是当它进入 Django 视图时:

def getTagFilterSidebar(request):

if 'selected_tags[]' in request.GET:
    all_tags = request.GET.getlist("all_tags[]")
    selected_tags = request.GET.getlist("selected_tags[]")

    debug_text4 = str(request.GET)

我没有看到标签列表。这是输出:

<QueryDict: '_': ['1539460657253'], 'all_tags[]': ['18'], 'selected_tags[]': ['13']>

其中的关键部分是它似乎在我的本地服务器上运行良好。但是,我正在使用 Zappa 并将其上传到 AWS。只有在 AWS 上它不能正常工作。所以我对正在发生的事情感到有点困惑。非常感谢您的帮助,谢谢!

【问题讨论】:

您可能需要在.get() 之后调用.join() 以获得all_tags 和selected_tags。 嗯,通过只返回一个字符串来解决问题,对吧?我试试看! 你能从开发服务器控制台显示实际被调用的路径吗?它应该附有参数。 在浏览器中查看您的 XHR 请求并检查完整路径,它是否包含所有数据? 加入效果很好,可能应该首先想到这一点,非常感谢。虽然我仍然很好奇为什么它不起作用。我不确定如何获取路径,您有说明链接或其他内容吗? 【参考方案1】:

正如丹尼尔·罗斯曼所建议的:

我没有传递一个列表,而是将两个变量中的连接函数转换成一个逗号分隔的字符串:

var all_tags = $("input:checkbox").map(function()  return this.id; ).get();
var selected_tags = $("input:checkbox:checked").map(function()  return this.id; ).get();

从那里,我使用了 Django 中的 split 函数来反转这个过程:

all_tags = request.GET.getlist("all_tags")[0].split(",")

不是最直接的解决问题的方法,但又快又容易。

【讨论】:

【参考方案2】:

问题在于 jQuery 使用重复的查询参数来序列化数组,Amazon API Gateway(由 Zappa 使用)doesn't support。

或者没有,我应该说。就在几天前,亚马逊宣布 API Gateway will now support this:

从今天开始,Amazon API Gateway 支持 API 请求中具有相同名称的多个标头和查询字符串参数。

无论如何,正如您所发现的,您只需实现自己的序列化,不需要重复的查询参数。

【讨论】:

以上是关于Django AJAX 请求仅获取最后一个元素(不是 getlist 问题)的主要内容,如果未能解决你的问题,请参考以下文章

Django AJAX 错误:仅协议方案支持跨源请求

Django - 使用 POST 请求仅上传模型中的图片

使用AJAX获取Django后端数据

django ajax 请求获取选定的索引

从 django 视图上的 AJAX 调用获取请求时出现错误 404

使用 django ajax jquery 提交一个文件不起作用的表单