Найти - Пользователи
Полная версия: Как сделать поле, значение которого зависит от другого поля.
Начало » Zope/Plone/Bluebream » Как сделать поле, значение которого зависит от другого поля.
1
Cykooz
Есть примерно следующий интерфейс:
class IMyObject(interface.Interface):
field1 = zope.schema.Choice(title='Field1', vocabulary='vocabulary1')
field2 = zope.schema.Choice(title='Field2', vocabulary='vocabulary2')
Требуется сделать так, что бы список возможных значений для field2 зависел от того какое значение выбранно для field1.
Как такое можно реализовать и использовать в форме редактирования на основе z3c.form ?
Sleepwalker
Посмотри в сторону zc.sourcefactory. Для поля Choice указывай как source - FilteringSource например (http://pypi.python.org/pypi/zc.sourcefactory/0.7.0#filtering). А вообще почитай документацию может что другое поможет.
astoon
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.
Cykooz
Спасибо за ответы.
На данный момент решил проблему поняв, что field2 мне пока что не нужен :)
Занимаюсь портированием плоновского продукта Product.Collage на BlueBream и поэтому иногда не сразу приходит осознание того, что некоторые поля интерфейсов из этого продукта можно и не переносить.

Естественно я думал насчёт реализации через JavaScript, и скорее всего через него и буду делать, когда снова понадобится такая заморочка.
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