Django中AJAX发送POST请求时request.POST获取nums值为None的问题求助
问题原因
- jQuery发送数组类型参数时,默认会自动在参数名后拼接
[],你前端声明参数是nums,实际发送到后端的参数名是nums[],所以用request.POST.get('nums')肯定获取不到值 - 数组属于多值参数,Django中不能直接用
get()方法获取,需要用getlist()方法读取多值参数 - 另外注意Django 3.1+已经废弃了
request.is_ajax()方法,你的写法request.is_ajax还缺少括号,高版本Django中这个判断会一直不生效
解决方法
你可以根据自己的业务场景选择以下任意一种方案:
方案1:不修改前端传参逻辑,直接适配后端取值
直接调整后端取值逻辑即可:
def creating_profile(request): # 兼容所有Django版本的AJAX请求判断,也可直接保留request.method == "POST"判断 if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' and request.method == "POST": # 参数名加[]后缀,用getlist获取数组 array = request.POST.getlist('nums[]') print(array) else: print("it's not ajax")
方案2:前端禁用参数自动追加规则,后端按原名称取值
前端AJAX配置新增traditional: true,关闭jQuery的深度序列化规则:
const RegisterForm = document.forms["RegisterForm"]; const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; let nums = [1, 2, 3] RegisterForm.addEventListener('submit', () => { $.ajax({ headers: { 'X-CSRFToken': csrftoken }, url: '/account/creating-profile/', type: 'POST', data: { nums: nums }, traditional: true, // 新增这一行配置 success: function (data) { // 业务逻辑 } }); });
后端对应调整取值逻辑:
def creating_profile(request): if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' and request.method == "POST": array = request.POST.getlist('nums') print(array) else: print("it's not ajax")
方案3:传递JSON格式数据(适合复杂参数场景)
如果后续会传递更复杂的嵌套参数,可以直接用JSON格式传参:
const RegisterForm = document.forms["RegisterForm"]; const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; let nums = [1, 2, 3] RegisterForm.addEventListener('submit', () => { $.ajax({ headers: { 'X-CSRFToken': csrftoken }, url: '/account/creating-profile/', type: 'POST', contentType: 'application/json', // 指定传参格式为JSON data: JSON.stringify({ nums: nums }), // 把参数序列化为JSON字符串 success: function (data) { // 业务逻辑 } }); });
后端从请求体中读取解析JSON即可:
import json def creating_profile(request): if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' and request.method == "POST": data = json.loads(request.body) array = data.get('nums') print(array) else: print("it's not ajax")
内容的提问来源于stack exchange,提问作者Mehran Bahrami
相关产品推荐
相关产品推荐

