2014-08-31 1 views
2

Я хотел бы создать тип контента, который использует коллективный.z3cform.datagridfield. Я пытаюсь следовать примеру, упомянутому в этой презентации: http://glicksoftware.com/presentations/dexterity-in-the-wildPlone: ​​Тип контента с управляемой моделью с коллективным.z3cform.datagridfield - вставка xml-модели в xml-модель

В примере показан ссылки на вторую схему из основной схемы. Это моя попытка.

<?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") 

, а затем в модели/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> 

ответ

2

Фактически оба файла модели xml были определены в файле mytype.py. Это вызвало проблему во время выполнения, когда mytype.py не может вызвать ... mytype.IPhoneSchema.

Решение было создать phoneschema.py файл независимо от mytype.py следующего содержания:

from plone.supermodel import model

class IPhoneSchema(model.Schema):

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

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

Вместо вызова mytype.IPhoneSchema, теперь мы можем назвать phoneschema.IPhoneSchema. Я могу включить схему телефона в моделях/mytype.xml (см. Пример ниже). phone.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 «нагрузок»:

phoneschema.py loads phone.xml

Ради ссылки, файл дерева моего продукта Теперь будет выглядеть примерно так это (я поместил звезду рядом с ключевым файлом в этом сценарии phoneschema.py, который ссылается на второй файл модели):

... 
├── __init__.py 
├── configure.zcml 
├── mytype.py 
├── mytype_templates 
│   └── view.pt 
├── models 
│   ├── mytype.xml 
│   └── phone.xml 
├── *phoneschema.py 
... 
Смежные вопросы