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

Django REST Framework中PUT方法不允许,单字段更新失败求助

解决PUT方法不被允许的问题

你在使用Django REST Framework的ModelViewSet更新设备对象时碰到PUT方法被禁止的问题,我来帮你一步步排查可能的原因:

1. 先检查路由配置是否正确

ModelViewSet默认自带了update(对应PUT请求)、partial_update(对应PATCH请求)等方法,但前提是你得用DRF的路由注册器来配置路由。如果是手动写路由,很可能漏掉了PUT方法的映射。

正确的路由配置示例:

from rest_framework import routers
from .views import DeviceViewSet

router = routers.DefaultRouter()
router.register(r'devices', DeviceViewSet)

urlpatterns = [
    # 其他路由...
    path('', include(router.urls)),
]

要是你手动配置路由,一定要明确添加PUT方法的映射:

path('devices/<pk>/', DeviceViewSet.as_view({'put': 'update'})),

2. 确认权限类没限制PUT请求

看看你的视图或者全局配置里的权限设置,比如如果用了ReadOnlyModelPermission,会直接禁止所有修改类请求(PUT/PATCH/DELETE)。

检查视图里的权限配置:

class DeviceViewSet(viewsets.ModelViewSet):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer
    permission_classes = [IsAuthenticated]  # 确保不是只读权限
    # ...你的list方法

也可以去全局settings.py里核对:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        # 别加ReadOnlyModelPermission这类只读权限
    ]
}

3. 检查请求URL是否指向单个资源

PUT请求必须针对单个资源的详情URL,比如/api/devices/1/(对应pk=1的设备),而不是列表URL/api/devices/——列表URL只支持GET(查列表)和POST(新建),不接受PUT请求。

4. CSRF认证问题(针对浏览器端请求)

如果是在浏览器里通过表单或AJAX发PUT请求,Django默认会检查CSRF token。要确保请求里携带了CSRF token:

  • AJAX请求可以在请求头里加X-CSRFToken,值从页面的cookie中获取;
  • 要是用Postman等工具测试,可以临时关闭CSRF检查(生产环境不建议这么做)。

5. 确认没重写update方法导致异常

虽然你只贴了list方法,但如果视图里自定义了update方法,要确保它能正常处理PUT请求。不过ModelViewSet的默认update方法是支持PUT的,除非重写时出现了逻辑错误。

如果以上步骤都排查过还是有问题,可以把完整的路由配置和视图代码贴出来,我再帮你深挖问题。

内容的提问来源于stack exchange,提问作者user7128116

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:29