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
相关产品推荐
相关产品推荐

