Django新手求助:POST方法不被允许问题(附代码)
解决Django REST Framework中POST方法不被允许的问题
问题分析
你遇到的POST方法不被允许问题,核心原因是路由冗余与视图方法支持不匹配:
Product_Detail继承自RetrieveAPIView,仅支持GET请求,若向product/<int:pk>/发送POST请求必然报错- 虽然
AddProduct是支持POST的CreateAPIView,但Product_List作为ModelViewSet已经内置了创建资源的POST功能,重复定义视图和路由反而容易导致路径匹配混乱
修复方案
方案1:简化路由(推荐)
直接利用ModelViewSet自带的CRUD功能,删除冗余的视图和路由,这样既能避免冲突,又能保持代码简洁:
修改urls.py:
from django.urls import path, include from . import views from rest_framework import routers router = routers.DefaultRouter() # 注册product路由,自动生成完整的CRUD路径 router.register(r'product', views.Product_List) urlpatterns = [ path('', include(router.urls)), ]
修改后,你可以通过以下路径完成对应操作:
GET /product/:获取产品列表POST /product/:创建新产品(支持POST请求)GET /product/<int:pk>/:获取单个产品详情PUT/PATCH /product/<int:pk>/:更新产品信息DELETE /product/<int:pk>/:删除产品
方案2:保留独立的AddProduct视图(不推荐)
如果一定要保留AddProduct视图,需要调整路由顺序,确保product/add/的路由优先匹配,避免被router的规则覆盖:
修改urls.py:
from django.urls import path, include from . import views from rest_framework import routers router = routers.DefaultRouter() router.register(r'', views.Product_List) urlpatterns = [ # 优先匹配add路径 path("product/add/", views.AddProduct.as_view()), path('product/', include(router.urls)), path('product/<int:pk>/', views.Product_Detail.as_view()), ]
注意:使用该方案时,必须确保POST请求发送到/product/add/路径,而非其他路径。
额外检查项
- 确认请求确实使用POST方法,而非GET、PUT等其他方法
- 若通过前端表单提交请求,需在表单中添加
{% csrf_token %};若使用API工具(如Postman),无需CSRF token,但要保证请求头格式正确 - 确保项目的
INSTALLED_APPS配置中包含'rest_framework'
内容的提问来源于stack exchange,提问作者Sahajdeep Singh Kharbanda
相关产品推荐
相关产品推荐

