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

Django AJAX Request Only Getting Last Element (not getlist issue)

我正在尝试在 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 上它不能正常工作。所以我对发生的事情有点困惑。非常感谢您的帮助,谢谢!

根据丹尼尔罗斯曼的建议:

我没有传递列表,而是在两个变量中使用了 join 函数,将它们变成一个逗号分隔的字符串:

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(",")

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

问题是 jQuery 正在使用重复的查询参数序列化数组,这是 Amazon API 网关(由 Zappa 使用)doesn't support

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

Starting today, Amazon API Gateway supports multiple headers and query string parameters with the same name in the API Request.

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