2

给出以下基于 z3c.form 的小部件https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/z3cform/widget.py

我想在一些浏览器视图中访问它的设置和相应的字段。由于 Widget 预先不知道架构和字段,因此我对获取小部件和字段需要哪些信息感兴趣。目前我有可用的字段名和上下文,这对于archtypes来说似乎已经足够了https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/browser.py#L60

编辑:为了简化问题,我想访问在某些z3c 表单及其小部件中定义的字段。除了传递请求和上下文以形成 init 然后访问该字段之外,我找不到其他方法。有多适配器吗?

这个想法是有一个 z3c.form 小部件,人们可以将它挂接到执行 ajax 调用的任何字段中。该 ajax 请求需要传递参数,响应将查找小部件的使用位置和设置。问题是,如何查找 z3c.form 字段以及需要哪些信息

4

1 回答 1

5

获取字段

如果您可以获取架构,则可以获取该字段。

对于敏捷内容类型,如果您知道字段名称和类型的 portal_type,则可以从类型的工厂类型信息( FTI ) 中获取架构。

所以,如果我们知道portal_typefield_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.autoformz3c.form.field.Field对象上手动设置一个widgetFactory(这与zope.schema字段不同!)。那么获取小部件的最佳方法就是您已经完成的操作,即手动调用启动FieldWidget

因此,例如,如果您想要UserAndGroupSelectionWidget

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

PS 由于我也在集体中并使用选择器小部件,因此我已经为您更新了代码;)

于 2011-12-14T15:00:42.427 回答