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:用模板过滤器处理
不想修改视图的话,可通过自定义模板过滤器在模板内转换:
- 在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
- 在模板中加载并使用过滤器:
{% 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
相关产品推荐
相关产品推荐

