Как получить доступ к настройкам виджета z3c.form из браузера - PullRequest
2 голосов
/ 12 декабря 2011

Учитывая следующий виджет, основанный на z3c.form https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/z3cform/widget.py

Я хотел бы в некотором браузере получить доступ к его настройкам и соответствующему полю.Поскольку Widget не знает схему и поле заранее, мне интересно, какая информация мне нужна, чтобы получить виджет и поле.В настоящее время у меня есть доступ к имени поля и контексту, которых, как мне кажется, достаточно для архетипов https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/browser.py#L60

РЕДАКТИРОВАТЬ: Чтобы упростить вопрос, я бы хотел получить доступ к полю это определено в некоторой z3c форме и его виджете.Я не мог найти другой путь, кроме передачи запроса и контекста для формирования init и последующего доступа к полю.Есть ли мультиадаптер?

Идея состоит в том, чтобы иметь виджет z3c.form, который люди подключают к любому полю, которое выполняет вызов ajax.Этот ajax-запрос должен передавать параметры, и ответ будет искать, где использовался виджет и с какими настройками.Вопрос в том, как найти поле z3c.form и какая информация необходима для этого?

1 Ответ

5 голосов
/ 14 декабря 2011

Получение поля

Если вы можете получить схему, вы можете получить поле.

Для типа содержимого ловкости, если вам известно имя поля и тип_порталя типа, вы можете получить схему из типа Информация о типе фабрики ( FTI ).

Итак, если мы знаем portal_type и field_name :

from zope.component import getUtility
from plone.dexterity.interfaces import IDexterityFTI
fti = getUtility(IDexterityFTI, name=portal_type)
schema = fti.lookupSchema()
field = schema.get(field_name)

Получение виджета

Из документации z3c.form: http://packages.python.org/z3c.form/widget.html

Виджет является мультиадаптером, поэтому, если у вас есть поле, вы можете получить его так:

ageWidget = zope.component.getMultiAdapter((field, request),
    interfaces.IFieldWidget)

Важно: Если вы указали виджет через plone.autoform , тогда этот виджет не будет выбран. plone.autoform вручную устанавливает widgetFactory для объекта z3c.form.field.Field (который не совпадает с zope.schema Поле!). Тогда лучший способ получить виджет - это то, что вы уже сделали, вручную вызвав FieldWidget .

Например, если вам нужен UserAndGroupSelectionWidget :

widget = FieldWidget(field, UserAndGroupSelectionWidget(field, request))

P.S Так как я тоже в коллективе и использую виджет выбора, я обновил код для вас ;)

...