django休息框架评论表不起作用

时间:2016-08-18 12:30:39

标签: angularjs django django-rest-framework

我使用django rest框架创建了这个网站,以便它可以在不刷新页面的情况下工作,

http://192.241.153.25:8000/#/post/image3

使用angular js的路由功能是构建单页应用程序的绝佳选择。

但由于某种原因,评论框似乎不起作用,因为它被放在角度js的模板中。

即使包含令牌,它也会抛出csrf令牌丢失错误。

判断{%csrf token%}标签是可见的,因为文本让我认为角度模板无法读取django标签。

有谁可以告诉我为什么评论表不起作用以及我如何解决这个问题?

    (function() {
  angular.module('app', ['ngRoute', 'ngResource'])
.controller('FilesListCtrl', ['$scope','$http', function($scope, $http) {//this one controller is new


  angular.forEach($scope.posts, function(_post){
    $scope.styles = producePostStyle(_post)
  });
  function producePostStyle(post) {
    return { "background-image": "url(" + post.image + ")" }
  }
$scope.producePostStyle = producePostStyle;
  $http.get('/api/posts/').then(function (response) {
              $scope.viewStyle = {
                  background: 'url('+response.data.results.image+')'
              };

  });

    $scope.images = [];
    $scope.next_page = null;
    var in_progress = true;

    $scope.loadImages = function() {
    //alert(in_progress);
            if (in_progress){
            var url = '/api/posts/';//api url
            if ($scope.next_page) {
                url = $scope.next_page;
            }
            $http.get(url).success(function(data) {
                $scope.posts = $scope.posts.concat(data.results);//according to api
                $scope.next_page = data.next;//acccording to api

                if ( ( $scope.next_page == null ) || (!$scope.next_page) ) {
                    in_progress = false;
                }
            });
        }
    };

    $scope.loadImages();
}])
angular.module('app')
.controller('profile_image', ['$scope','$http', function($scope, $http) {//this one controller is new

  $http({
    url: '/api/users/profile/',
    method: "GET",
    params: {username: 'lifeto'}
}).then(function successCallback(response) {
    console.log("Profile Image");
    console.log(response);
    $scope.lifeto_img = response.data;
}, function errorCallback(response) {
    console.log("Error fetching profile image!");
});

}])




.directive('whenScrolled', function($document) {//another directive
        return function(scope, elm, attr) {
            var raw = elm[0];

             $document.bind('scroll', function() {
                if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
                    scope.$apply(attr.whenScrolled);
                }
            });
        };
    })
    .config(function($resourceProvider, $routeProvider, $httpProvider) {
      $httpProvider.defaults.xsrfCookieName = 'csrftoken';
      $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
      // Don't strip trailing slashes from calculated URLs
      $resourceProvider.defaults.stripTrailingSlashes = false;
      $routeProvider
        .when('/', {
          template: '<posts></posts>'
        })
        .when('/posts', {
          template: '<posts></posts>'
        })
        .when('/post/:postId', {
          template: '<post></post>'
        })
        .otherwise({
          redirectTo: '/'
        });
    });
  angular.module('app')
    .constant('API_URL', '/api/posts/');
  angular.module('app')
    .factory('Posts', function($resource, API_URL) {
      return $resource(API_URL, {format: 'json'}, {
        queryPosts: {
          method: 'GET',
          isArray: false
        },
        getPostInfo: {
          url: API_URL + ':postId/',
          method: 'GET',
          isArray: false,
          params: {
            postId: '@postId',
            format: 'json'
          }
        }
      });
    });
  angular.module('app')
    .directive('post', function() {
      return {
        restrict: 'E',
        templateUrl: '/static/post.html',
        scope: {},
        controller: function($scope, $routeParams, Posts) {
          $scope.post = null;

          function clean(id) {
        return id.toLowerCase().replace(/\s/g, "-");
      }

      function _initialize() {
   Posts.getPostInfo({
     postId: clean($routeParams.postId)
   })
              .$promise
                .then(function(result) {
                  $scope.post = result;
                  console.log(result)
                });
          }
          _initialize();
        }
      };
    });
  angular.module('app')
    .directive('posts', function() {
      return {
        restrict: 'E',
        templateUrl: '/static/posts.html',
        scope: {},
        controller: function($scope, Posts) {
          $scope.posts = [];
          function _initialize() {
            Posts.queryPosts().$promise.then(function(result) {
              $scope.posts = result.results;
            });
          }
          _initialize();
        }
      };
    });
})();

1 个答案:

答案 0 :(得分:0)

自您添加

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';

$ http将负责csrf。

现在您可以使用$http

发布数据了
$http({
    method: 'POST',
    url: '/url/',
    data: {
        "key1": 'value1',
    },
}).then(function successCallback(response) {
    #do
    },
    function errorCallback(response) {
    #do
    });

注意:请勿在此处使用Ajax Post。为此你必须做一些除此之外的一些csrf。