在 Django 视图中调用“request.POST”时,Ajax POST 不发送数据
Posted
技术标签:
【中文标题】在 Django 视图中调用“request.POST”时,Ajax POST 不发送数据【英文标题】:Ajax POST not sending data when calling 'request.POST' in Django view 【发布时间】:2016-04-04 14:35:30 【问题描述】:我正在尝试让 Ajax POST
将数据发送到我的视图,以便我可以在那里操作我的数据,当我单击类 up-arrow
的 div
时。
问题是,当我单击该 div 并在我的视图文件中打印 request.POST
时,我得到一个包含 <QueryDict: >
的 POST
对象。空的!我似乎无法弄清楚为什么我的 POST 请求没有发送我的数据。
这是我的 html...
% for i in post.posts %
<li>
<div>
<div class='up-arrow'>
</div>
i
</div>
</li>
% endfor %
这是我的 AJAX/jQuery...
$(document).ready(function()
$('.up-arrow').click(function()
$(this).hide()
console.log('click')
$.ajax(
headers:
'Content-Type':'application/json',
'X-CSRFToken': getCookie('csrftoken')
,
url: 'voteuppost',
type: 'POST',
data: 'dane': 123456789101112,
success: function(data)
alert('success!')
,
error: function()
alert('fail')
)
return false
);
function getCookie(name)
var cookieValue = null;
if (document.cookie && document.cookie != '')
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++)
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '='))
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
return cookieValue;
)
这是我的看法...
class VoteUpPost(View):
def post(self, request):
print(request.POST)
return JsonResponse('status': True)
这是我的网址路径...
url(r'^voteuppost$', VoteUpPost.as_view()),
我尝试过的事情...
1) 我使用GET
而不是POST
,我可以使用request.GET.get('dane')
获取数据值
1) 尝试使用request.POST.data
和request.POST.DATA
并得到以下结果...AttributeError: 'QueryDict' object has no attribute 'data'
我也得到一个“失败”alert
。
如何通过POST
请求将我的数据发送到我的视图,然后访问其中的数据?
【问题讨论】:
你能通过开发者工具查看post请求中包含的内容吗?在网络标签下 你试过JSON.stringify('dane': 123456789101112)
吗?传递 JSON 时,它必须是一个字符串。请参阅:***.com/questions/32570523/… 这可能不是您的问题,但需要考虑。
【参考方案1】:
使用application/json
发布JSON 数据时,您需要使用request.body
而不是request.POST
。
像这样:
class VoteUpPost(View):
def post(self, request):
print(request.body)
data = json.loads(request.body)
return JsonResponse('status': True)
正如 Jacques 所提到的,确保更新您的 js 以传递 JSON 字符串。
变化:
data: 'dane': 123456789101112,
收件人:
data: JSON.stringify('dane': 123456789101112),
【讨论】:
谢谢保罗,你成功了! 当我print(request.body)
我得到b'dane=123456789101112'
。如何访问123456789101112
?
更新了我的答案。基本上你需要确保数据是一个字符串。
当我这样做时,我得到b'"dane":123456789101112'
,但无法使用密钥访问该值。我已经尝试过request.body.dane
和request.body['dane']
。有什么想法吗?
是的,您需要将其加载到 json 中。我会更新我的答案。【参考方案2】:
Django 请求只能解析 application/x-www-form-urlencoded 和
multipart/form-data 到request.POST
。对于其他内容类型,您必须使用 request.body
属性。对于内容类型的断言,您可以从request.META.get('CONTENT_TYPE')
获取内容类型
def sample_view(request):
if request.META.get('CONTENT-TYPE') == 'application/json':
data = json.loads(request.body)
return JsonResponse('any-message':'Hello')
【讨论】:
感谢指点,我没有给你答案,因为上面列出了更简洁的答案。我给了你一票,因为你解释了保罗没有解释的地方。以上是关于在 Django 视图中调用“request.POST”时,Ajax POST 不发送数据的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在另一个视图中调用 Django Rest Framework 视图?