3

すべてを出力するために、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」以外のものを使用する必要がありますか?

4

1 に答える 1

0

db.Model の「dynamic_properties」メソッドを使用して、「プロパティ」メソッドと同じ形式で Expando のプロパティを取得できます ( Model クラスで説明されています) 。

ただし、これらの関数はプロパティの値を返さないことに注意してください...「プロパティ」は、実装クラス (この場合は db.ReferenceProperty と db.DateTimeProperty) にマップされたプロパティ名の辞書を返し、「dynamic_properties」は単に返すだけです。 Expandos は動的な値を実装クラスにマップできないため、プロパティ名のリスト。

プロパティの値を取得するには、 を使用する必要がありますgetattr(model, prop_name)。この関数を純粋に Django テンプレート内で (カスタム タグ ライブラリなしで) 実行する方法はありませんが、そのようにメソッドを保持して書き直すことはできます...

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 %}
于 2010-12-08T07:57:41.707 に答える