Итерация по динамическим свойствам Expando в шаблонах Django - PullRequest
3 голосов
/ 02 августа 2010

Я пытаюсь перебрать динамические свойства 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'?

1 Ответ

0 голосов
/ 08 декабря 2010

Вы можете использовать метод db.Model 'dynamic_properties' для извлечения свойств Expando в том же формате, что и метод 'properties' (как описано в классе Model )

Помните, что эти функции не возвращают значение свойства, хотя ... 'properties' возвращает словарь имен свойств, сопоставленных с их классом реализации (в данном случае 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 %}
...