Django中Method Not Allowed (POST)错误的解决方法咨询
解决Axios POST请求返回405 (Method Not Allowed)的问题
错误信息
POST http://127.0.0.1:8000/dashbaord/Menu/editStatus 405 (Method Not Allowed)
相关代码片段
myscript.js
let changeStatus = (id, place) => { axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"; axios.defaults.xsrfCookieName = "csrftoken"; axios.defaults.withCredentials = true; axios({ method: 'post', url: 'editStatus', data: { 'tes1': 'test', 'tes2': 'test' }, headers: { "content-type": "application/json" } }).then(function (response) { console.log('dsdsdsd') }).catch(function (error) { console.log(error) }); }
urls.py
path('editStatus', EditMenuItemStatus.as_view(), name="edit_status_item")
views.py
class EditMenuItemStatus(BaseDetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() context = self.get_context_data(object=self.object) return self.render_to_response(context)
解决步骤
1. 更换视图基类
BaseDetailView是Django为单个对象详情展示设计的基类,默认仅支持GET请求。即使重写了post方法,其底层逻辑仍可能限制请求方法,或要求必须传递pk/slug参数才能正常工作。
建议将视图父类替换为更基础的View,完全自定义请求处理逻辑:
# views.py from django.views.generic.base import View from django.shortcuts import render class EditMenuItemStatus(View): def post(self, request, *args, **kwargs): # 此处编写状态修改的业务逻辑 # 如需获取对象,可通过request.data或自行传入的ID参数处理 return render(request, 'your_template.html', {})
2. 修正URL路径问题
- 错误信息中的URL存在拼写错误:
dashbaord应为dashboard,先确认后端URL配置与前端请求路径的拼写一致。 - 前端使用相对路径
editStatus容易出错,建议改用绝对路径确保请求地址正确:
// myscript.js axios({ method: 'post', url: '/dashboard/Menu/editStatus', // 修正拼写并使用绝对路径 // 其他配置保持不变 })
3. 若坚持使用BaseDetailView,需补充URL参数
如果一定要用BaseDetailView,必须在URL中添加pk或slug参数,因为该基类依赖这些参数获取目标对象:
# urls.py path('editStatus/<int:pk>', EditMenuItemStatus.as_view(), name="edit_status_item")
同时前端请求时要在URL中传入对象ID:
// myscript.js axios({ method: 'post', url: `/dashboard/Menu/editStatus/${id}`, // 传入要修改的对象ID // 其他配置保持不变 })
此时视图中的post方法就能正常获取对象:
def post(self, request, *args, **kwargs): self.object = self.get_object() // 通过pk参数获取对象 // 编写业务逻辑 return self.render_to_response(context)
4. 验证CSRF配置
虽然当前错误是405,但CSRF验证失败也可能引发异常。确认浏览器开发者工具的Network面板中,请求头包含正确的X-CSRFTOKEN,且Django的CSRF Cookie已正常设置。
内容的提问来源于stack exchange,提问作者alireza keshavarz
相关产品推荐
相关产品推荐

