Django-Rest-Framework ModelViewSet创建视图异常:提交失败且报404错误
问题分析与解决方案
首先咱们来定位核心问题:你的URL配置和请求方式不匹配DRF的RESTful路由规则,导致/api/create/是无效路径,提交时触发404错误。
为什么会出现404?
你在articles/api/urls.py里用DefaultRouter注册了空字符串路由:
router.register(r'', ArticleViewSet, base_name='articles')
DRF的DefaultRouter会自动为ModelViewSet生成标准REST路由:
GET /api/:获取文章列表POST /api/:创建新文章(这才是你需要的创建接口)GET /api/<pk>/:获取单篇文章详情PUT/PATCH /api/<pk>/:更新单篇文章DELETE /api/<pk>/:删除单篇文章
你访问的/api/create/并不是DRF自动生成的路由,所以GET请求返回404;同时你用PUT请求提交创建表单也是错误的——PUT是用来更新已有资源的,创建新资源应该用POST请求。
具体解决步骤
1. 修正前端表单的提交配置
把创建表单的:
- 提交路径从
/api/create/改成/api/ - 请求方法从PUT改成POST
这样表单提交时就会命中DRF自动生成的创建接口,数据就能正常存入数据库了。
2. (可选)如果一定要用/api/create/路径
如果你坚持想要自定义/api/create/路径,可以在articles/api/urls.py里手动添加路由,单独映射创建视图:
from articles.api.views import ArticleViewSet from rest_framework.routers import DefaultRouter from django.urls import path router = DefaultRouter() router.register(r'', ArticleViewSet, base_name='articles') # 手动添加创建路径 urlpatterns = router.urls + [ path('create/', ArticleViewSet.as_view({'post': 'create'}), name='article-create'), ]
不过更推荐遵循DRF的RESTful规范,直接用默认的POST /api/来创建资源,这样更符合行业通用的API设计习惯。
额外验证
你提到列表视图下方的新增表单能正常提交,那是因为那个表单应该是直接提交到/api/(POST请求),和DRF的路由匹配上了,所以能正常工作。你只需要把单独的/api/create/页面的表单配置改成一样的就行。
内容的提问来源于stack exchange,提问作者naccode
相关产品推荐
相关产品推荐

