Plone:Dexterity模型驱动的内容类型,带有collective.z3cform.datagridfield - 在xml模型中嵌套xml模型

时间:2014-08-31 00:51:13

标签: plone dexterity

我想创建一个使用collective.z3cform.datagridfield的内容类型。我一直在尝试按照本演示文稿中提到的示例: http://glicksoftware.com/presentations/dexterity-in-the-wild

该示例演示了从主模式引用第二个模式。这是我的尝试。

<?xml version="1.0" ?>
<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:form="http://namespaces.plone.org/supermodel/form">
<field name="telephone" type="zope.schema.List"
    form:widget="collective.z3cform.datagridfield.DataGridFieldFactory">

      <title>Telephone</title>
      <description>Enter telephone numbers here</description>
      <max_length>10</max_length>
      <min_length>2</min_length>
      <missing_value/>
      <readonly>False</readonly>
      <required>False</required>

      <value_type type="collective.z3cform.datagridfield.DictRow">
        <title>Number</title>
        <schema>mypackage.mytype.IPhoneSchema</schema>
      </value_type>
    </field>
</schema>
</model>

我在 mypackage / mytype.py 中定义我的第二个架构,如下所示:

from plone.supermodel import model

class IPhoneSchema(model.Schema):
    """Schema for dict rows used in DataGridFields
    name is the 'real'  name
    token is the token used in the vocabularies
    """
#
    model.load("models/phone.xml")

然后在 models / phone.xml 中,我有以下内容:

<?xml version="1.0" ?>
<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:form="http://namespaces.plone.org/supermodel/form">

    <schema>
         <field name="number" type="zope.schema.TextLine"> 
            <description/> 
            <required>False</required> 
            <title>Number</title> 
        </field> 
    </schema>
</model>

当我启动Plone时,我收到以下错误:

 SupermodelParseError: 'module' object has no attribute 'mytype'
      <schema>mypackage.mytype.IPhoneSchema</schema>

1 个答案:

答案 0 :(得分:2)

实际上,两个模型xml文件都是在mytype.py文件中定义的。这在运行时导致问题,mytype.py无法调用... mytype.IPhoneSchema。

解决方案是创建一个独立于mytype.py的 phoneschema.py 文件,其中包含以下内容:

  

来自plone.supermodel导入模型

     

类IPhoneSchema(model.Schema):

   """Schema for dict rows used in DataGridFields
   they are used for individual phone numbers
   """

   model.load("models/phone.xml")

我们现在可以调用 phoneschema.IPhoneSchema ,而不是调用mytype.IPhoneSchema。我可以在models / mytype.xml 中包含手机架构(请参阅下面的示例)。

  

...   

  <title>Telephone</title>
  <description>Enter telephone numbers here</description>
  <max_length>10</max_length>
  <min_length>2</min_length>
  <missing_value/>
  <readonly>False</readonly>
  <required>False</required>

  <value_type type="collective.z3cform.datagridfield.DictRow">
    <title>Number</title>
    <schema>mypackage.mytype.IPhoneSchema</schema>
  </value_type>
</field> 
     

...

这是关系图,phoneschema.py'加载'phone.xml:

phoneschema.py loads phone.xml

为了便于参考,我的产品的文件树现在看起来像这样(我在这个场景中的密钥文件旁边放了一个星号 phoneschema.py ,它引用了第二个模型文件):

...
├── __init__.py
├── configure.zcml
├── mytype.py
├── mytype_templates
│   └── view.pt
├── models
│   ├── mytype.xml
│   └── phone.xml
├── *phoneschema.py
...