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

Django中迭代JSONField字段被识别为字符串的问题

解决Django JSONField在模板中无法遍历的问题

核心原因

Django的JSONField虽设计用来存储JSON结构数据,但如果存入时是纯JSON字符串(而非Python字典/列表对象),或视图未做格式转换,模板会将其识别为普通字符串,无法直接用for循环迭代。

可行解决方法

方法1:确保存入模型的是Python对象

创建或更新ControleProduto对象时,直接传入Python列表/字典,而非JSON字符串:

# 错误示例:直接存储JSON字符串
ControleProduto.objects.create(produtos='[{"nome": "ProdutoA"}, {"nome": "ProdutoB"}]')

# 正确示例:传入Python列表
produtos_data = [{"nome": "ProdutoA"}, {"nome": "ProdutoB"}]
ControleProduto.objects.create(produtos=produtos_data)

方法2:在视图中转换字符串为Python对象

若数据库已存储字符串格式的JSON,在视图中先解析为Python对象再传给模板:

from django.shortcuts import render
import json
from .models import ControleProduto

def produto_view(request):
    controle = ControleProduto.objects.get(pk=1)
    # 判断是否为字符串,是则解析
    if isinstance(controle.produtos, str):
        controle.produtos = json.loads(controle.produtos)
    return render(request, 'produto_template.html', {'controle': controle})

方法3:用模板过滤器处理

不想修改视图的话,可通过自定义模板过滤器在模板内转换:

  1. 在app目录下创建templatetags文件夹,新建json_utils.py:
import json
from django import template

register = template.Library()

@register.filter(name='parse_json')
def parse_json(value):
    if isinstance(value, str):
        try:
            return json.loads(value)
        except ValueError:
            return value
    return value
  1. 在模板中加载并使用过滤器:
{% load json_utils %}

{% for produto in controle.produtos|parse_json %}
    <div>{{ produto.nome }}</div>
{% endfor %}

额外检查项

  • 直接查看数据库内produtos字段值,确认是JSON结构而非纯字符串;
  • Django 3.1+版本的JSONField默认自动处理Python对象与JSON的转换,若仍出问题,优先排查数据存入时的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:35:26