Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2011 14:50:35

Cykooz
От:
Зарегистрирован: 2010-10-07
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сделать поле, значение которого зависит от другого поля.

Есть примерно следующий интерфейс:

class IMyObject(interface.Interface):
field1 = zope.schema.Choice(title='Field1', vocabulary='vocabulary1')
field2 = zope.schema.Choice(title='Field2', vocabulary='vocabulary2')
Требуется сделать так, что бы список возможных значений для field2 зависел от того какое значение выбранно для field1.
Как такое можно реализовать и использовать в форме редактирования на основе z3c.form ?



Офлайн

#2 Май 5, 2011 16:57:21

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

Как сделать поле, значение которого зависит от другого поля.

Посмотри в сторону zc.sourcefactory. Для поля Choice указывай как source - FilteringSource например (http://pypi.python.org/pypi/zc.sourcefactory/0.7.0#filtering). А вообще почитай документацию может что другое поможет.



Офлайн

#3 Май 6, 2011 15:42:33

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

Как сделать поле, значение которого зависит от другого поля.

Scheme и Vocabulary - это все придумано для работы с контекстом, но не с запросом.

Но контекст можно сделать динамически генерируемым с учетом запроса. На вскидку - в методе getContent() формы отдавать адаптер, проксирующий реальный контекст с учетом данных запроса.

class EditMyObject(z3c.form.EditForm):

def getContent(self):
return IMyObjectView(self.context, self.request) # делает field зависимым от request
тогда в коде vocabulary2 можно взять context.field1. Разумеется это предположение верно только если context при формировании vocabulary берется тот, который возвращается методом getContent() формы. Так ли это на самом деле, я не знаю.

Это, конечно, все в порядке мозгового штурма, на деле я так не пробовал и предпочел бы более естесственный путь - javascript. Тем не менее, если попробуешь с getContent, напиши получилось ли. Особенно интересно, что будет взято в качестве контекста при генерировании vocabulary. Может быть, он даже и проще и надежнее, но придется нажимать form submit после заполнения field1.

Другой путь делать контектс динамическим - это отдавать траверсером LocationProxy “реального” (ZODB-шного контекста). Еще более правильно - добавляя специальный namespace. Это решение для больших расширяемых систем, как мне кажется архитектурно наиболее логичное.

Sleepwalker
Посмотри в сторону zc.sourcefactory. Для поля Choice указывай как source - FilteringSource например (http://pypi.python.org/pypi/zc.sourcefa … #filtering). А вообще почитай документацию может что другое поможет.
Ну, это не поможет, по-моему. Данная библиотека просто предоставляет набор удобств. Сколько я не пытался ее использовать, возвращался к обычному vocabulary.



Офлайн

#4 Май 8, 2011 01:28:18

Cykooz
От:
Зарегистрирован: 2010-10-07
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сделать поле, значение которого зависит от другого поля.

Спасибо за ответы.
На данный момент решил проблему поняв, что field2 мне пока что не нужен :)
Занимаюсь портированием плоновского продукта Product.Collage на BlueBream и поэтому иногда не сразу приходит осознание того, что некоторые поля интерфейсов из этого продукта можно и не переносить.

Естественно я думал насчёт реализации через JavaScript, и скорее всего через него и буду делать, когда снова понадобится такая заморочка.



Отредактировано (Май 8, 2011 01:29:14)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version