You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:27:15