使用collective.z3cform.datagridfield与plone.app.registry和GenericSetup

时间:2013-08-01 15:56:06

标签: python plone z3c.form genericsetup

Plone 4.2.0.1,plone.app.registry 1.1,plone.supermodel 1.1.1,collective.z3cform.datagridfield 0.11

我正在尝试将collective.z3cform.datagridfield用于plone.app.registry字段,但实际上却无法为其设置值。文档似乎没有说 除了使用collective.z3cform.datagridfield.registry.DictRow作为注册表的Persistent版本之外。

作为参考,我的班级如下:

class IMySchema(form.Schema):
  code = schema.TextLine(title = _(u"Code"), required=False)
  name = schema.TextLine(title = _(u"Name"), required=False)

from collective.z3cform.datagridfield.registry import DictRow
class IMySettings(form.Schema):
  """ """
  form.widget(display_fields=DataGridFieldFactory)
  display_fields = schema.List(
                     title = _(u"Display Fields"),
                     description = _(u"The fields that will be displayed in view and edit pages"),
                     value_type=DictRow(title=_(u"Field"), schema=IMySchema),
                     required=False,
                     )

我可以使用GenericSetup设置空白值,并且与此注册表交互的控制面板表单可以正常工作。 但我不能让GenericSetup从registry.xml导入该记录的值。输入值TTP并使用GenericSetup导出它会产生以下结果:

<registry>
  <record field="display_fields" interface="my.product.interfaces.settings.IMySettings" name="my.product.interfaces.settings.IMySettings.display_fields">
    <field type="plone.registry.field.List">
      <description>The fields that will be displayed in view and edit pages</description>
      <required>False</required>
      <title>Display Fields</title>
    </field>
    <value>
      <element>{'code': u'authors', 'name': u'Authors'}</element>
    </value>
  </record>
</registry>

但如果我尝试导入它,我会收到错误!

TypeError: ('Could not adapt', None, <InterfaceClass zope.schema._bootstrapinterfaces.IFromUnicode>)

这是plone.supermodel.utils“converter = IFromUnicode(field)”中的这一行,在调试器中我看到'field'的值实际上是None。

那么,处理datagridfields的registry.xml的正确方法是什么?或者我将不得不以编程方式在setuphandlers.py中添加记录?我很擅长使用 注册表和plone.supermodel,并且假设该字段为None,如果我的registry.xml完全错误,我不会感到惊讶。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您将代码名称声明为schema.TextLine(unicode),但您在注册表中使用了字符串;尝试以下方法:

{u'code':u'authors',u'name':u'Authors'}