Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2010 22:09:55

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB как вызвать функцию из другого вида?

Как вызвать функцию из какого-либо вида через питон из класса другого вида, не зная интерфейса объекта?
Пожалуй, слишком сложная формулировка, так что объясню вопрос на примере:

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

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

В тале это можно сделать к примеру так: для каждого object вызвать object/@@edit/update
Как это сделать в классе вида через питон?



Офлайн

#2 Сен. 28, 2010 09:29:26

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB как вызвать функцию из другого вида?

Можно, в принципе сделать следующее:
1. Зарегистрировать вид с именем, например, “obj_update” для объекта, который вы хотите изменять.

<page
...
name = "obj_update"
class = "<класс_вида_edit_в_котором_находится_метод_update>"
attribute = "update"
...
/>
В коде этот вид вызывать с помощью getMultiAdapter().



Офлайн

#3 Сен. 28, 2010 09:55:51

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB как вызвать функцию из другого вида?

Как-то странно работает

<browser:page
for="..interfaces.ITBool"
name="update"
permission="zope.Public"
class=".edit_form.EditForm"
attribute = "update"
/>
В шаблоне при вызове obj/@@update вызывается метод __call__, а при вызове obj/@@update/update метод update. Почему так?



Офлайн

#4 Сен. 28, 2010 10:29:14

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB как вызвать функцию из другого вида?

Вроде сделал.
Насколько я понял, мультиадаптер возвращает весь класс?

вот код

    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)

Офлайн

#5 Сен. 28, 2010 14:20:55

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB как вызвать функцию из другого вида?

В шаблоне при вызове 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 - это по сути тоже адаптер). Этот обьект может быть как екземпляром класса, так и функцией.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version