Restangular删除不工作(是:DJANGO:{“detail”:“方法'删除'不允许。”})

时间:2013-08-21 23:14:54

标签: python django angularjs restangular

检查后缀是否需要:

RestangularProvider.setRequestSuffix('/?format=json');

否则django正在向客户端投掷重定向,虽然它有效 - 但它不正确。


最后一项更改是添加:

RestangularProvider.setRequestSuffix('?format=json');
在模块定义中

,并将其从服务定义中删除。这样,restangular可以以django rest框架后端所期望的方式构建url。因此,应该在JS方面设置服务:

var spaceJam = angular.module('spaceJam', ['ui.bootstrap', 'restangular'])
            .config(function (RestangularProvider) {
                RestangularProvider.setRequestSuffix('?format=json');
                RestangularProvider.setResponseExtractor(function (response, operation) {
                     // blah
                     return response ;
                })
            })

spaceJam.factory('EventsResource', function (Restangular) {
    return Restangular.all('events')
})

注入您的控制器并作为列表访问:

EventsResource.getList().then(function(events){
                $scope.events = events
            })

并删除一个项目(触发HTTP删除):

 $scope.events[someRandomIndex].remove()

并且在服务器端,您需要确保返回ID。在django rest框架中,这包括一个类似下面的解决方案,其中mixin用于包含id。

感谢所有想到这一点的人。


取得进展 - 显然网址被归还而不是id。此链接http://abesto.net/django-rest-framework-add-id-to-in-hyperlinkedmodelserializer/概述了在序列化程序中添加混合,该序列化程序添加了id.in案例,该链接在将来不起作用,以下是相关代码段:

class WithPkMixin(object):
    def get_pk_field(self, model_field):
        return self.get_field(model_field)

class EventSerializer(WithPkMixin, serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Event

我认为问题现在是我的资源/ restangular资源定义的工厂方法,因为Id被附加在错误的位置(我认为因为我最初是黑客攻击):

  spaceJam.factory('EventsResource', function (Restangular) {
        return Restangular.all('events/?format=json')
    })

所以需要删除字符串'/?format = json',并在其他位置重新添加。


更新看起来像发送的方法是根节点。我正在使用angularjs和restangular我的javascript看起来像:

spaceJam.factory('EventsResource', function (Restangular) {
        return Restangular.all('events/?format=json')
    })

var CalendarListCtrl = function($scope, $timeout, EventsResource) {
        var timeout = 10000
        $scope.events = []

        $scope.refresh = function (){
            EventsResource.getList().then(function(events){
                $scope.events = events
            })
        }

        var asychUpdate = function(){
            $scope.refresh()
            //$timeout(asychUpdate, timeout);
        }
        asychUpdate()

        $scope.delete = function(urlToDelete) {

            var eventToDelete = _.find($scope.events, function(one) {
                return one.url === urlToDelete;
            });

            eventToDelete.remove();
            $scope.refresh()
        }

    }

所以虽然remove方法看起来被记录为从列表中删除项目的方式 - 它似乎没有正确的URL。


我正在学习django / python,因为我建立了一个与我无关的非盈利网站。我能够为列表/元素数组发出gets。 “添加”(post)方法有效,现在我正在尝试连接删除。我的服务器响应是:

{"detail": "Method 'DELETE' not allowed."}

所以我认为我需要获得动词的许可 - 但我不知道在哪里。我正在使用DJANGO REST Framework。我无法在谷歌找到这个,所以我在这里问那些善良和知识渊博的人。提前感谢您,如果我需要发布更多代码,请告诉我。

urls.py

router = routers.DefaultRouter()
router.register(r'events', views.EventViewSet)

urlpatterns = patterns('',
    (r'^', include(router.urls)),
)

models.py

class Event(models.Model):
      title = models.CharField(max_length=200)
      recurring = models.BooleanField()
      day = models.CharField(max_length=20, blank=True)
      date = models.DateField(null=True, blank=True)
      time = models.TimeField()
      description = models.CharField(max_length=500)
      venue = models.CharField(max_length=200, blank=True)
      venueAddress = models.CharField(max_length=200, blank=True)
      venueCity = models.CharField(max_length=200, blank=True)

serializers.py

class EventSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Event

views.py

class EventViewSet(viewsets.ModelViewSet):
    paginate_by = None
    queryset = Event.objects.all()
    serializer_class = EventSerializer

1 个答案:

答案 0 :(得分:1)

在原帖中回答,但包括

  1. 确保在其余服务中返回ID
  2. 完成封装restangular资源的角度工厂,以便可以动态构建URL,其中包括
  3. 将任何网址参数移至请求后缀。