Форум сайта python.su
Как вызвать функцию из какого-либо вида через питон из класса другого вида, не зная интерфейса объекта?
Пожалуй, слишком сложная формулировка, так что объясню вопрос на примере:
есть класс Thing.
У него есть вид @@set
В классе Thing могут содержаться множество различных объектов (абсолютно разных), но у каждого из этих объектов есть вид @@edit и в нём определена функция update().
Мы вызываем из шаблона нажатием кнопки submit класс вида, в котором происходит обработка.
Суть её должна заключаться в том, чтобы для каждого объекта внутри себя (for x in self.context.values()) вызвать функцию update вида @@edit.
В тале это можно сделать к примеру так: для каждого object вызвать object/@@edit/update
Как это сделать в классе вида через питон?
Офлайн
Можно, в принципе сделать следующее:
1. Зарегистрировать вид с именем, например, “obj_update” для объекта, который вы хотите изменять.
<page
...
name = "obj_update"
class = "<класс_вида_edit_в_котором_находится_метод_update>"
attribute = "update"
...
/>
Офлайн
Как-то странно работает
<browser:page
for="..interfaces.ITBool"
name="update"
permission="zope.Public"
class=".edit_form.EditForm"
attribute = "update"
/>
Офлайн
Вроде сделал.
Насколько я понял, мультиадаптер возвращает весь класс?
вот код
def __call__(self):
for i in self.context.values():
getMultiAdapter((i, self.request), name='edit_form').update()
return self.template()
Отредактировано (Сен. 28, 2010 11:20:00)
Офлайн
В шаблоне при вызове obj/@@update вызывается метод __call__, а при вызове obj/@@update/update метод update. Почему так?
1. Когда пишем obj/@@update то метод __call__ вызывается по умолчанию. Даже есле пишем:
<tal:block content="structure object" />
<tal:block content="structure python: object.__call__()" />
Офлайн