我想创建一个使用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>
答案 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 ,它引用了第二个模型文件):
...
├── __init__.py
├── configure.zcml
├── mytype.py
├── mytype_templates
│ └── view.pt
├── models
│ ├── mytype.xml
│ └── phone.xml
├── *phoneschema.py
...