Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 7, 2008 17:54:18

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

Help, please! Zope 3

Есть класс А с интерфейсом:
class ClassA(zope.interface.Interface):
name = TextLine(title=u“Name”, required=True)
value = TextLine(title=u“Value”, required=False)
1). Поле select:
Есть класс B интерфейс которого должен иметь
атрибут - выпадающий список с именами (атрибут name) существующих
объектов класса А.
Как это можно осуществить? Пожалуйста помогите!!!



Офлайн

#2 Июнь 7, 2008 22:26:36

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Help, please! Zope 3

Обычно лучше проиндексировать твои объекты, предоставляющие интерфейс IClassA. Тогда в схеме второго интерфейса используем словарь собранный на основе индексов.
Если выбирать нужно только один объект из списка, тогда
interfaces.py ::

class IFoo(Interface):
selected = Choice(
title = u'Choice object',
required = False,
vocabulary = 'foo.vocabulary')
Теперь код словаря (могут быть другие варианты, я почти скопировал из своего текущего проекта). В данном случае в поле selected интерфейса IFoo хранятся именно индексы объектов (в этом есть плюсы и есть минусы, зависит от конкретного случая), ну а в форме отображается name.
vocabulary.py
from zope.component import getUtility
from zope.schema.vocabulary import SimpleTerm, SimpleVocabulary
from zope.security.proxy import removeSecurityProxy
from zope.app.intid.interfaces import IIntIds
from zope.app.catalog.interfaces import ICatalog

def fooVocabulary(context):
catalog = getUtility(ICatalog)
intids = getUtility(IIntIds)
result = catalog.apply({'class_a_index':{'any':None}},)
class_a_objects = [(id, removeSecurityProxy(intids.getObject(id)).name) for id in result]
terms = [SimpleTerm(value=id, token=id, title=name) for (id, name) in class_a_objects]
return SimpleVocabulary(terms)
Теперь зарегистрируем эту функцию как утилиту. configure.zcml ::
 <utility
provides="zope.schema.interfaces.IVocabularyFactory"
component=".vocabulary.fooVocabulary"
name="foo.vocabulary"
/>
Остается тольк позаботиться о создании индекса ‘class_a_index’. Обычно это делается не ручным кликанием в ZMI, а в коде. Но можешь и вручную - добавь в сайт-менеджер каталог и в него индекс по любому полю для ICLassA, название индекса в данном случае, в примере - ‘class_a_index’. Про утилиту IIntIds только не забудь.

Однако если объекты ClassA однозначно находятся в каком-то одном контейнере - лучше чтоб утилита предоставляющая словарь читала не индексы, и values() этого контейнера, ИМХО.



Отредактировано (Июнь 7, 2008 22:30:28)

Офлайн

#3 Июнь 8, 2008 08:30:20

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

Help, please! Zope 3

Спасибо огромное! сегодня попробую все сделать!!!



Офлайн

#4 Июнь 25, 2008 13:11:31

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

Help, please! Zope 3

Опять проблема! Через ZMI проиндексировать не могу, когда делаю индекс “страницу невозможно отобразить”. А как проиндексировать в коде понятия не имею! Помогите чем сможете!!!



Офлайн

#5 Июнь 25, 2008 13:56:59

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Help, please! Zope 3

Не понял.
Что именно в ZMI делаешь ? Индексируется все автоматически при добавлении объектов.
В коде при добавлении обхекта:

from zope.lifecycleevent import ObjectCreatedEvent
from zope.event import notify

some_object = ... ... ...

notify(ObjectCreatedEvent(some_object))
some_container[id] = some_object
это событие само вызывает все что нужно. Также есть ObjectModifiedEvent.
В атоматом сгенерированных формах это уже есть.



Офлайн

#6 Июнь 29, 2008 10:46:29

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

Help, please! Zope 3

Нужно проиндексировать объекты, предоставляющие интерфейс IClassA. (см. выше) В ZMI сделать нечего не получается. В закладке «Управление сайтом» добавляю генератор уникальных идентификаторов, каталог (имя по умолчанию), в каталоге добавляю индекс по полям, ссылаюсь на интерфейс нужного класса и в результате «Невозожно отобразить страницу»! Как сделать все правильно??? И как сделать это в коде???



Офлайн

#7 Июнь 29, 2008 11:42:58

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

Help, please! Zope 3

lissa
Нужно проиндексировать объекты, предоставляющие интерфейс IClassA. (см. выше) В ZMI сделать нечего не получается. В закладке «Управление сайтом» добавляю генератор уникальных идентификаторов, каталог (имя по умолчанию), в каталоге добавляю индекс по полям, ссылаюсь на интерфейс нужного класса и в результате «Невозожно отобразить страницу»! Как сделать все правильно??? И как сделать это в коде???
Может ты не зарегистрировал утилиту IIntIds и каталог, а только добавил их в контейнер ? …



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version