2010-08-02 52 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 %}