如何从浏览器视图访问z3c.form小部件设置

iEl*_*ric 2 plone dexterity z3c.form

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

我想在一些browserview中访问其设置和相应的字段.由于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字段以及需要哪些信息

JC *_*and 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)
Run Code Online (Sandbox Code Playgroud)

获取小工具

从z3c.form文档:http://packages.python.org/z3c.form/widget.html

小部件是一个多功能适配器,所以如果你有这个字段,你可以这样得到它:

ageWidget = zope.component.getMultiAdapter((field, request),
    interfaces.IFieldWidget)
Run Code Online (Sandbox Code Playgroud)

重要提示:如果您已通过plone.autoform指定了窗口小部件,则不会获取该窗口小部件.plone.autoformz3c.form.field.Field对象上手动设置widgetFactory(与zope.schema Field不同!).然后,通过手动调用启动FieldWidget,您已经完成了获取窗口小部件的最佳方法.

例如,如果你想要UserAndGroupSelectionWidget:

widget = FieldWidget(field, UserAndGroupSelectionWidget(field, request))
Run Code Online (Sandbox Code Playgroud)

PS因为我也是集体使用选择器小部件,我已经为你更新了代码 ;)