在Django视图中调用'request.POST'时,Ajax POST不发送数据

时间:2015-12-30 15:43:17

标签: javascript jquery ajax django

我正在尝试使用Ajax POST将数据发送到我的视图,这样当我点击divup-arrow时,我就可以操作我的数据。

问题是,当我点击所述div并在我的视图文件中打印request.POST时,我收到的POST对象包含<QueryDict: {}>。空!我似乎无法弄清楚为什么我的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请求将数据发送到我的视图,然后访问其中的数据?

2 个答案:

答案 0 :(得分:16)

使用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})

同样雅克提到的,请确保更新你的js以传递JSON字符串。

变化:

data: {'dane': 123456789101112},

要:

data: JSON.stringify({'dane': 123456789101112}),

答案 1 :(得分:4)

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'})