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

Django JSONField值通过JavaScript提取时JSON格式异常

问题根源与解决方案

问题根源

你在模板中直接输出group.group_users时,Django会将Python列表转换成Python风格的字符串表示(用单引号包裹元素),比如['hello@world', 'foo@bar'],但标准JSON要求使用双引号,这直接导致JSON.parse解析失败。

正确解决方案

方案1:使用Django内置json_script模板标签(推荐)

这个标签会自动将Python数据序列化为标准JSON格式,同时避免XSS风险:

<div id="group-modal">
    {% for group in form.groups.field.queryset %}
        <label>
            <input type="checkbox" class="group-checkbox" value="{{ group.id }}" data-members-id="group-members-{{ group.id }}">
            {{ group.name }}
        </label>
        {{ group.group_users|json_script:"group-members-{{ group.id }}" }}
        <br>
    {% endfor %}
</div>

对应的JavaScript获取逻辑:

document.querySelectorAll('.group-checkbox').forEach(checkbox => {
    const membersId = checkbox.dataset.membersId;
    const members = JSON.parse(document.getElementById(membersId).textContent);
    // 这里可以直接使用members数组做后续处理
});

方案2:视图层提前序列化

在视图中为每个分组生成标准JSON字符串,再传递到模板:

import json
# 假设你已获取目标分组queryset
groups = UserGroup.objects.filter(owner=request.user)
for group in groups:
    group.serialized_members = json.dumps(group.group_users)

模板中直接使用序列化后的内容:

<input type="checkbox" class="group-checkbox" value="{{ group.id }}" data-members="{{ group.serialized_members|safe }}">

注意

直接使用|safe过滤器只是关闭HTML转义,并没有改变Python列表的字符串格式(单引号),所以无法解决JSON解析问题,必须用专门的JSON序列化方法处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:32:39