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

点击Datatable按钮更新数据时Axios无法传递Django路由所需主键ID如何解决

问题核心原因

你代码的核心错误出在Axios请求的URL拼接逻辑,以及Django后端PUT请求的数据解析逻辑,具体修改方案如下:


1. 修复URL拼接错误

Django模板标签{% url %}是在服务端渲染阶段执行的,此时前端JS的动态变量id还没有生成,直接在模板标签中拼接+id不会生效。
修改方案:
先在你的页面JS代码段最上方(Vue实例创建前)定义路由前缀:

// 先通过Django模板生成不含pk的路由前缀,把默认填充的0替换为空
const updateTodoBaseUrl = "{% url 'todospaapp:save_todo_update' pk=0 %}".replace('/0', '')

再修改Axios请求的url配置:

updateTodo: function(id) {
    axios({
        // 拼接实际的id值,注意结尾加斜杠避免Django重定向
        url: `${updateTodoBaseUrl}/${id}/`,
        method: 'put',
        data: {
            todo_text: this.input_todo
        },
        headers: {
            'X-CSRFToken': '{{ csrf_token }}'
        }
    }).then(response => {
        this.getTodos()
    })
}

2. 修复Django路由配置

给路由结尾添加斜杠,匹配Django默认的重定向规则,避免PUT请求被301重定向后丢失请求数据:

from django.urls import path
from . import views
from django.views.generic import TemplateView

app_name = 'todospaapp'

urlpatterns = [
    path('', views.index, name='index'),
    path('todos/', views.todos, name='todos'),
    path('save_todo/', views.save_todo, name='save_todo'),
    # 新增结尾斜杠
    path('save_todo_update/<int:pk>/', views.save_todo_update, name='save_todo_update'),
]

3. 修复后端PUT请求解析逻辑

原代码中JSONParser.parse(request)写法错误,需要先实例化JSONParser再调用解析方法:

def save_todo_update(request, pk):
    try:
        todoitem = TodoItem.objects.get(pk=pk)
    except TodoItem.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = TodoItemSerializer(todoitem)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        # 修正解析逻辑:先实例化JSONParser
        data = JSONParser().parse(request)
        # 若没有使用DRF的JSONParser,也可以直接用原生json解析:
        # import json
        # data = json.loads(request.body)
        serializer = TodoItemSerializer(todoitem, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        # 错误返回加上400状态码更规范
        return JsonResponse(serializer.errors, status=400)

额外校验点

确认你的TodoItemSerializer序列化类配置了todo_text字段的读写权限,避免字段校验不通过的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:18:00