3

检查它的后缀需要是:

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。

感谢任何对此进行思考的人。


取得进展 - 显然是返回 url 而不是 id。此链接http://abesto.net/django-rest-framework-add-id-to-in-hyperlinkedmodelserializer/概述了在添加 id 的序列化程序中添加一个 mixin。以防该链接将来不起作用,这是相关的片段:

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,因为我为与之相关的非营利组织建立了一个网站。我能够为元素列表/数组发出获取。“添加”(发布)方法有效,现在我正在尝试连接删除。我的服务器响应是:

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

所以我假设我需要允许那个动词——但我不知道在哪里。我正在使用 DJANGO REST 框架。我无法在谷歌上找到这个,所以我在这里询问善良和知识渊博的人。提前谢谢你,如果我需要发布更多代码,请告诉我。

网址.py

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

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

模型.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)

序列化程序.py

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

视图.py

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

1 回答 1

1

在原帖中回答,但包括

  1. 确保在其余服务中返回 ID,并且
  2. 封装了restangular资源的角度工厂已经完成,以便可以动态构建URL,其中包括
  3. 将任何 URL 参数移动到请求后缀。
于 2013-08-22T12:53:23.973 回答