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.
无论如何,正如您所发现的,您可以只实现自己的序列化,不需要重复的查询参数。
我正在尝试在 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.
无论如何,正如您所发现的,您可以只实现自己的序列化,不需要重复的查询参数。