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

为何设置enctype='application/json'后CONTENT_TYPE仍为application/x-www-form-urlencoded?如何JSON提交表单?

问题原因与解决方案

为什么CONTENT_TYPE还是application/x-www-form-urlencoded?

HTML标准对<form>的enctype属性有严格限制,仅支持三个合法值:

  • application/x-www-form-urlencoded(默认值)
  • multipart/form-data(用于文件上传场景)
  • text/plain(纯文本格式提交)

当你设置enctype='application/json'时,浏览器无法识别这个非标准值,会自动忽略该设置并使用默认的application/x-www-form-urlencoded,因此请求的CONTENT_TYPE始终是默认类型。

如何将表单数据以JSON格式发送到服务器?

原生HTML表单不支持直接发送JSON数据,需要通过JavaScript拦截表单提交事件,手动处理数据并发送请求:

1. 修改HTML表单(添加ID方便JS获取)

<form id="json-submit-form" action="{% url 'xxx' %}" method="post">
    {% csrf_token %}
    <input type='number' name='bottle-on-wall' value='1'>
    <input type='number' name='bottle-on-wall' value='2'>
    <input type='number' name='bottle-on-wall' value='3'>
    <button type="submit">send</button>
</form>

2. 添加JavaScript处理逻辑

document.getElementById('json-submit-form').addEventListener('submit', async function(e) {
    // 阻止浏览器默认的表单提交行为
    e.preventDefault();

    // 获取Django的CSRF令牌
    const csrfToken = this.querySelector('[name="csrfmiddlewaretoken"]').value;

    // 收集表单数据,处理同名输入为数组
    const formData = new FormData(this);
    const payload = {};
    for (const [key, value] of formData.entries()) {
        if (payload[key]) {
            if (!Array.isArray(payload[key])) {
                payload[key] = [payload[key]];
            }
            payload[key].push(value);
        } else {
            payload[key] = value;
        }
    }

    // 将数据转为JSON字符串
    const jsonPayload = JSON.stringify(payload);

    // 发送POST请求
    try {
        const response = await fetch(this.action, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRFToken': csrfToken
            },
            body: jsonPayload
        });

        // 根据实际需求处理响应
        const responseData = await response.json();
        console.log('请求成功:', responseData);
    } catch (error) {
        console.error('请求失败:', error);
    }
});

最终发送的JSON格式示例

{
    "bottle-on-wall": ["1", "2", "3"],
    "csrfmiddlewaretoken": "你的CSRF令牌内容"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:28:24