【问题标题】:PUT request not appearing in allowed requests using ModelViewSet使用 ModelViewSet 的 PUT 请求未出现在允许的请求中
【发布时间】:2019-01-31 04:51:26
【问题描述】:

我无法像文档中那样使用 ModelViewSet 发出 put 请求。 我的观点,序列化器如下

class PostsViewSet(viewsets.ModelViewSet):
    queryset = PostsModel.objects.all()
    serializer_class = PostsSerializer

class PostsSerializer(serializers.ModelSerializer):
    class Meta:
        model=PostsModel
        fields=('id','title', 'author', 'body')

PUT 方法在允许的方法中,如图所示。

这是我的 posts.urls.py 即我的应用程序

router = DefaultRouter()
router.register('', PostsViewSet)


    urlpatterns = [
        path('', include(router.urls))
    ]

这是我的根 urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/posts', include('posts.urls')),
]

并响应

http://localhost:8000/api/posts/1/

【问题讨论】:

  • 当然PUT在这里是不允许的。 PUT 用于更新实例,因此需要创建帖子实例。然后在该网址api/posts/<post_id> 上,您可以使用PUTPATCHDELETE。填写表格和POST 以创建新帖子
  • 我创建了帖子,无法更新..
  • 不,这是一个学习项目,所以我没有创建任何权限类,所有 API 都是开放的
  • 是的,我试过 /api/posts/1,它说在 URL 模式中没有匹配的 url
  • 您可以在序列化程序中将'url' 添加到您的字段中。然后你会得到每个帖子的网址作为回应。你可以点击它。

标签: django django-rest-framework django-views put http-method


【解决方案1】:

我认为问题出在这里:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/posts', include('posts.urls')),  # <-- Here
]

应该是:

path('api/posts/', include('posts.urls')),   # need to append slash after posts

这里,PUT请求没有问题,问题出在路由本身。当您点击/posts/1 时,django 找不到它(因为配置不正确)。

【讨论】:

  • 它从 POSTMAN 对我有用,但是它没有显示在 DRF 页面允许的请求中,谢谢伙计:)
  • 我不明白 GET 和 POST 请求是如何工作的。
  • 可能您在/api/posts(不带斜线)处请求GET 和POST。
【解决方案2】:

id 后面不需要斜杠

改变:

http://localhost:8000/api/posts/1/

到:

http://localhost:8000/api/posts/1

或将 URL 模式更改为:

path('api/posts/', include('posts.urls')),

并使用以下网址访问 API:

http://localhost:8000/api/posts/1/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2023-04-02
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多