Найти - Пользователи
Полная версия: BB как вызвать функцию из другого вида?
Начало » Zope/Plone/Bluebream » BB как вызвать функцию из другого вида?
1
LightOfMooN
Как вызвать функцию из какого-либо вида через питон из класса другого вида, не зная интерфейса объекта?
Пожалуй, слишком сложная формулировка, так что объясню вопрос на примере:

есть класс Thing.
У него есть вид @@set
В классе Thing могут содержаться множество различных объектов (абсолютно разных), но у каждого из этих объектов есть вид @@edit и в нём определена функция update().

Мы вызываем из шаблона нажатием кнопки submit класс вида, в котором происходит обработка.
Суть её должна заключаться в том, чтобы для каждого объекта внутри себя (for x in self.context.values()) вызвать функцию update вида @@edit.

В тале это можно сделать к примеру так: для каждого object вызвать object/@@edit/update
Как это сделать в классе вида через питон?
regall
Можно, в принципе сделать следующее:
1. Зарегистрировать вид с именем, например, “obj_update” для объекта, который вы хотите изменять.
<page
...
name = "obj_update"
class = "<класс_вида_edit_в_котором_находится_метод_update>"
attribute = "update"
...
/>
В коде этот вид вызывать с помощью getMultiAdapter().
LightOfMooN
Как-то странно работает
<browser:page
for="..interfaces.ITBool"
name="update"
permission="zope.Public"
class=".edit_form.EditForm"
attribute = "update"
/>
В шаблоне при вызове obj/@@update вызывается метод __call__, а при вызове obj/@@update/update метод update. Почему так?
LightOfMooN
Вроде сделал.
Насколько я понял, мультиадаптер возвращает весь класс?

вот код
    def __call__(self):
for i in self.context.values():
getMultiAdapter((i, self.request), name='edit_form').update()
return self.template()
Sleepwalker
В шаблоне при вызове obj/@@update вызывается метод __call__, а при вызове obj/@@update/update метод update. Почему так?


1. Когда пишем obj/@@update то метод __call__ вызывается по умолчанию. Даже есле пишем:
<tal:block content="structure object" />
то это еквивалентно:

<tal:block content="structure python: object.__call__()" />
2. Во втором случае вы явно указывете метод update. Поэтому он и вызывается.

3. Мультиадаптер возвращает обьект, который зарегистрирован как адаптер (page - это по сути тоже адаптер). Этот обьект может быть как екземпляром класса, так и функцией.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB