2013-08-21 40 views
3

檢查它後綴需要是:Restangular移除不工作(被:DJANGO:{「細節」:「方法‘刪除’不允許的。」})

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/概述添加一個mixin○,增加了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') 
    }) 

因此字符串「?/格式= 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,因爲我爲與之建立了非營利性的網站建立了關聯關係。我能夠發佈元素列表/數組的元素。 「添加」(後)方法的作品,現在我試圖掛鉤刪除。我的服務器迴應是:

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

所以我假設我需要許可該動詞 - 但我不知道在哪裏。我正在使用DJANGO REST框架。我一直無法在谷歌上找到它,所以我要求這裏的善良和知識淵博的人。預先感謝您,請讓我知道是否需要發佈更多代碼。

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 
+2

你打什麼網址?如果你使用'path/to/my/resource /'而不是'path/to/my/resource/PK /',它不知道要刪除哪個對象。 –

+1

是,它似乎您試圖刪除根視圖,請檢查:https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/tests/test_generics.py#L93 – danihp

+0

同意我想刪除根節點。那麼,我正在使用restangular來代理API - 讓我們看看它在做什麼。雖然我遵循了一個例子,但這一直證明了自己的傻瓜。 – akaphenom

回答

1

答案在原來的職位,但包括

  1. 確保該ID將在剩下的服務和
  2. 角度工廠封裝restangular資源做這樣的URL可以動態構建,其中包括
  3. 將任何URL參數移動到請求後綴。