在 Django 模板中迭代 Expando 的动态属性

Posted

技术标签:

【中文标题】在 Django 模板中迭代 Expando 的动态属性【英文标题】:Iterating through Expando's Dynamic properties in Django Templates 【发布时间】:2011-03-24 06:51:51 【问题描述】:

我正在尝试遍历 Expando-Model 的动态属性,以便将它们全部输出。除了创建自己的方法之外,还有其他方法吗:

class Event(db.Expando):
    platform = db.ReferenceProperty(Platform)
    date = db.DateTimeProperty()

    def getValues(self):
        return self._dynamic_properties

然后在模板中 - 传递一个“平台”对象:

% for event in platform.event_set %
    <b> event.date </b><br />
    % for pair in event.getValues.items %
         pair.0  =  pair.1 <br />
    % endfor %
% endfor %

这行得通,但我很惊讶我不能这样做:

% for event in platform.event_set %
    <b> event.date </b><br />
    % for pair in event.items %
         pair.0  =  pair.1 <br />
    % endfor %
% endfor %

没有我自己的方法调用...我应该使用“.items”以外的东西吗?

【问题讨论】:

是否 % for pair in event._dynamic_properties.items % 不起作用? 否;有人提出这个建议,但答案已被撤回。无法访问以下划线开头的属性。为建议干杯。 【参考方案1】:

您可以使用 db.Model 的“dynamic_properties”方法来检索 Expando 的属性,格式与“properties”方法相同(如文档中的under the Model class)

请记住,这些函数不会返回属性的值,但...“properties”返回映射到其实现类(在本例中为 db.ReferenceProperty 和 db.DateTimeProperty)的属性名称字典,以及“dynamic_properties” ' 只返回属性名称列表,因为 Expandos 无法将动态值映射到实现类。

为了获取属性值,您必须使用getattr(model, prop_name)。没有办法纯粹在 Django 模板中运行这个函数(没有custom tag library),但是你可以像这样保留并重写你的方法......

def getExpandoValues(self):
   return dict((name, getattr(self, name)) for name, impl_class in self.dynamic_properties())

...并重新编写模板以通过新字典输入访问值:

% for event in platform.event_set %
  <b> event.date </b><br />
  % for pair in event.getExpandoValues %
      pair.0  =  pair.1 <br />
  % endfor %
% endfor %

【讨论】:

以上是关于在 Django 模板中迭代 Expando 的动态属性的主要内容,如果未能解决你的问题,请参考以下文章

Django - 在模板的for循环中迭代数字

如何在 django 模板中迭代字典的列表值

在 Django 模板中迭代 JSON

如何在模板中迭代 python-django 循环 N 次?

迭代 django 表单结果(不在模板中)

django在模板中迭代dict时遇到问题[重复]