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

使用UUID作为主键时调用deleteBl函数触发语法错误的解决咨询

问题描述

我有一个接收id作为参数的删除函数:

<script>
    function deleteBl(id){
        fetch('', {
            method: 'DELETE',
            headers: {
                'X-CSRFToken': '{{ csrf_token }}'
            },
            body: JSON.stringify({
                'id': id
            }),
            credentials: 'same-origin',
        })
    }
</script>

对应的Django模板代码:

{% for item in bl_query_set %}
<tr>
    <th scope="row">{{ forloop.counter }}</th>
    <td>{{ item.bl_number }}</td>
    <td class="text-center">{{ item.cargo_name }}</td>
    <td>{{ item.cargo_quantity }} {{ item.cargo_measurement }}</td>
    <td>
        <a onclick="deleteBl({{ item.id }})">
            <i class="fas fa-trash-alt"></i>
        </a>
    </td>
</tr>
{% endfor %}

使用默认自增ID作为主键时一切正常,但将主键改为UUID后,控制台抛出错误:Uncaught SyntaxError: Invalid or unexpected token。

问题原因

UUID是字符串类型,模板渲染时直接输出{{ item.id }}会生成类似deleteBl(123e4567-e89b-12d3-a456-426614174000)的代码。JavaScript会把UUID中的-解析为减号,导致语法错误。而自增ID是数字类型,直接传入不会触发语法问题。

解决方法

方法1:给UUID参数添加引号

修改模板中的onclick代码,将UUID用单引号包裹,确保JavaScript将其识别为字符串:

<a onclick="deleteBl('{{ item.id }}')">
    <i class="fas fa-trash-alt"></i>
</a>

渲染后会生成deleteBl('123e4567-e89b-12d3-a456-426614174000'),避免语法错误。

方法2:使用data属性+事件监听(更推荐)

避免内联onclick事件,改用data-*属性存储UUID,通过事件监听处理删除逻辑,更符合现代前端开发规范:

修改Django模板

<td>
    <a class="delete-bl-btn" data-id="{{ item.id }}">
        <i class="fas fa-trash-alt"></i>
    </a>
</td>

修改JavaScript代码

<script>
    // 为所有删除按钮绑定点击事件
    document.querySelectorAll('.delete-bl-btn').forEach(btn => {
        btn.addEventListener('click', function() {
            const id = this.dataset.id;
            fetch('', {
                method: 'DELETE',
                headers: {
                    'X-CSRFToken': '{{ csrf_token }}',
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    'id': id
                }),
                credentials: 'same-origin',
            })
        });
    });
</script>

这种方式不仅解决了字符串参数的问题,还避免了内联事件的安全隐患,代码结构更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:55:17