【问题标题】:Django view not receiving data from Angularjs $http requestDjango 视图未从 Angularjs $http 请求接收数据
【发布时间】:2015-02-02 03:58:33
【问题描述】:

我正在使用 Angular $http 将数据发布到 django,但 django 没有收到它。我一定是在滥用 $http(因为这适用于 ajax)或者我的 django 视图是错误的。

<div ng-controller="mycontroller2">
    <form ng-submit="submit()">
    {% csrf_token %}
       Search by name:<input ng-model="artiste" />
       <input type="submit" value="submit" />
    </form>
    <table>
        <tr ng-repeat="artist in artists">
            <td> {({ artist.fields.link })} </td>
        </tr>
    </table>
</div>
<script>
artApp.controller('mycontroller2', ['$scope', '$http',
function($scope, $http){
    $scope.submit = function(){           

    var postdata = {
        method: 'POST',
        url: '/rest/',
        data: {
            "artiste": $scope.artiste
        },
        headers: {
            'X-CSRFTOKEN': "{{ csrf_token }}"
        }
    };
    $http(postdata)
        .success(function(data){
            $scope.artists = data;
        })
    }
}]);
</script>

views.py 中的请求处理程序看起来像

def rest(request):

    artistname = request.POST.get("artiste") # should get 'da vinci'
    response_data = {}
    response_data = serializers.serialize("json", Art.objects.filter(artist__contains=artistname))
    return HttpResponse(json.dumps(response_data), content_type="application/json")

我从 Django 得到的错误是ValueError at /rest/ Cannot use None as a query value

我获取“artiste”值的调用不能从$httpdata 对象返回“da vinci”。我确定它已成功发送,因为数据 artiste: da vinci 显示在我的 devtools 标题中。 Django 只是没有得到那个价值。 request.POST.get("artiste") 调用有问题?

【问题讨论】:

  • 您是否检查过(控制台上的“网络”选项卡)数据(艺术家)是否真的发送到服务器?
  • 是的,我相信。在 Network 选项卡中,它显示 500 错误,我单击它并转到“Headers”,在“Request Payload”下显示artiste: "da vinci"。你说的是这个吗?
  • 是的..所以这确实是一个 django 问题。您需要使用pdbrunserver_plus 来检查请求对象
  • 我解决了。由于数据是原始 json 数据,我必须通过 json.loads(request.body) 而不是 request.POST.get() 来获取它。向#django IRC 房间大喊。

标签: javascript python django angularjs


【解决方案1】:

由于我的$http 请求中的数据是原始 json 数据,因此我的 Django 请求处理程序必须进行更改才能处理。现在函数(在views.py中)看起来像

def rest(request):

    artistname = json.loads(request.body)      # <- accepts raw json data
    artistname = artistname['artiste']         # <- and now I can pull a value
    response_data = {}
    response_data = serializers.serialize(
                    "json", Art.objects.filter(artist__contains=artistname))

    return HttpResponse(json.dumps(response_data), content_type="application/json")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2021-08-28
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多