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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:23