【问题标题】:Ajax POST not sending data when calling 'request.POST' in Django view在 Django 视图中调用“request.POST”时,Ajax POST 不发送数据
【发布时间】:2016-04-04 14:35:30
【问题描述】:

我正在尝试让 Ajax POST 将数据发送到我的视图,以便我可以在那里操作我的数据,当我单击类 up-arrowdiv 时。

问题是,当我单击该 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.datarequest.POST.DATA 并得到以下结果...AttributeError: 'QueryDict' object has no attribute 'data' 我也得到一个“失败”alert

如何通过POST 请求将我的数据发送到我的视图,然后访问其中的数据?

【问题讨论】:

  • 你能通过开发者工具查看post请求中包含的内容吗?在网络标签下
  • 你试过JSON.stringify({'dane': 123456789101112})吗?传递 JSON 时,它必须是一个字符串。请参阅:stackoverflow.com/questions/32570523/… 这可能不是您的问题,但需要考虑。

标签: javascript jquery ajax django


【解决方案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.danerequest.body['dane']。有什么想法吗?
  • 是的,您需要将其加载到 json 中。我会更新我的答案。
【解决方案2】:

Django 请求只能解析 application/x-www-form-urlencodedmultipart/form-datarequest.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'})

【讨论】:

  • 感谢指点,我没有给你答案,因为上面列出了更简洁的答案。我给了你一票,因为你解释了保罗没有解释的地方。
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 2021-07-28
  • 2011-02-21
  • 1970-01-01
  • 2012-04-15
  • 2021-02-07
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多