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

Django模板如何遍历EmbeddedField嵌入对象的所有字段值

你遇到的报错本质是因为servico.alvos是单个PublicoAlvo模型实例,既不是Django查询集也不是字典,所以你之前用的三种遍历方式都不适用。

之前三种写法失败的原因:

  • servico.alvos.all():all()是Django查询集(QuerySet)的专属方法,单个模型实例没有该方法,因此无输出
  • servico.alvos.items():items()是字典的专属方法,未做自定义处理的模型实例没有该方法,因此无输出
  • 直接遍历servico.alvos:Python默认不支持直接遍历自定义模型类的实例,因此抛出not iterable报错

以下是两种可行的实现方案:

方案1:仅修改模板逻辑,无需调整模型代码

直接调用模型实例自带的__dict__属性获取所有字段键值对,过滤掉系统自动生成的下划线开头私有属性即可:

{% for key, value in servico.alvos.__dict__.items %}
    {% if not key.startswith('_') %}
    <HTML1>
    字段名:{{ key }},字段值:{{ value }}
    <HTML2>
    {% endif %}
{% endfor %}

这个方法无需修改后端代码,适合临时调试或者简单业务场景使用。

方案2:给模型加自定义方法,扩展性和可维护性更强

在PublicoAlvo类中新增方法,主动返回所有业务字段的键值对,避免把__dict__里的冗余属性带出来,后续新增字段也无需修改遍历逻辑:

调整后的models.py代码:

from djongo import models


class PublicoAlvo(models.Model):
    def __str__(self):
        return ''
    alvo1 = models.CharField(max_length = 126)
    alvo2 = models.CharField(max_length = 126, blank = True, default = '')
    
    # 新增自定义方法,返回所有业务字段的键值对
    def get_all_fields(self):
        fields = {}
        # 遍历模型定义的所有字段,自动适配新增字段
        for field in self._meta.fields:
            fields[field.name] = getattr(self, field.name)
        return fields

    class Meta:
        abstract = True

class Servico(models.Model):
    t_id = models.CharField(primary_key = True, unique = True, max_length = 252)
    alvos = models.EmbeddedField(
        model_container = PublicoAlvo
    ) 

对应的模板遍历代码:

{% for key, value in servico.alvos.get_all_fields.items %}
    <HTML1>
    字段名:{{ key }},字段值:{{ value }}
    <HTML2>
{% endfor %}

内容的提问来源于stack exchange,提问作者Vinícius Santos de Pontes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:48:04