gpt4 book ai didi

python - Restangular 删除不工作(是 : DJANGO: {"detail": "Method ' DELETE' not allowed.“})

转载 作者:行者123 更新时间:2023-11-28 18:47:06 24 4
gpt4 key购买 nike

检查它的后缀需要是:

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')
})

注入(inject)到您的 Controller 中并作为列表访问:

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

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

 $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

我认为现在问题出在我的资源/重新定义资源定义的工厂方法中,因为 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

View .py

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

最佳答案

在原始帖子中回答但包括

  1. 确保在其余服务中返回 ID,并且
  2. 封装了restangular资源的angular factory完成了,这样就可以动态构建URL,其中包括
  3. 将任何 URL 参数移动到请求后缀。

关于python - Restangular 删除不工作(是 : DJANGO: {"detail": "Method ' DELETE' not allowed.“}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com