2010-08-02 73 views
3

我试图遍历Expando模型的动态属性以便输出它们全部。难道还有比创建自己的方法,像这样这样做其他的方式:在Django模板中迭代Expando的动态属性

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'以外的东西吗?

+0

{event for event._dynamic_properties.items%}中的对不起作用吗? – 2010-08-02 18:09:13

+0

否;有人提出这个建议,但答案已被撤回。无法访问以下划线开头的属性。欢呼的建议。 – Wex 2010-08-03 10:26:19

回答

0

可以使用db.Model的“dynamic_properties的”方法来检索在Expando的性能,在相同的格式为“属性”的方法(如记录under the Model class

请记住,这些函数不返回属性的值,尽管...'properties'返回映射到其实现类(本例中为db.ReferenceProperty和db.DateTimeProperty)的属性名称的字典,而'dynamic_properties'只是返回属性名称列表,因为Expandos可以' t将动态值映射到实现类。

为了获得物业的价值,你必须使用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 %}