Python 灵活使用collective.z3cform.datagridfield
我对Plone有些生疏,我正在尝试灵活地使用DataGridField。目标是使用Plone 4.1在我们的内部网上发布可用性研究的结果。我已经创建了一个自定义文档类型(称为交互),我想对其中一个字段使用datagrid对一个表进行建模,该表包含两列,显示结果摘要 根据中列出的说明,我已成功地将collective.z3cform.datagrid egg添加到我的构建中的egg列表中,并且我可以看到新的加载项在我的站点加载项列表中显示为活动的。我创建了一个简单的模式Python模块,它描述了一个文档,其中显示了我正在记录的可用性研究的结果:Python 灵活使用collective.z3cform.datagridfield,python,plone,dexterity,z3c.form,Python,Plone,Dexterity,Z3c.form,我对Plone有些生疏,我正在尝试灵活地使用DataGridField。目标是使用Plone 4.1在我们的内部网上发布可用性研究的结果。我已经创建了一个自定义文档类型(称为交互),我想对其中一个字段使用datagrid对一个表进行建模,该表包含两列,显示结果摘要 根据中列出的说明,我已成功地将collective.z3cform.datagrid egg添加到我的构建中的egg列表中,并且我可以看到新的加载项在我的站点加载项列表中显示为活动的。我创建了一个简单的模式Python模块,它描述了一
from five import grok
from zope import schema
from zope import interface
from plone.directives import form
from plonetheme.mytheme import InteractionMessageFactory as _
from plone.app.textfield import RichText
from z3c.form import field, button
from Products.CMFCore.interfaces import IFolderish
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
class IFinding(interface.Interface):
summary = schema.TextLine(title=_(u"Summary"))
percentage = schema.TextLine(title=_(u"Percentage"))
class IInteraction(form.Schema):
findings = schema.List(
title=_(u"Overview of findings"),
required=False,
value_type=DictRow(
title=_(u"Finding"),
schema=IFinding
)
)
class EditForm(form.EditForm):
grok.context(IInteraction)
grok.require('zope2.View')
fields = field.Fields(IInteraction)
fields['findings'].widgetFactory = DataGridFieldFactory
我已通过向profiles/default/types.xml添加一行来注册新的交互内容类型:
<?xml version="1.0"?>
<object meta_type="Plone Types Tool" name="portal_types">
<property name="title">Controls the available content types in your portal</property>
<object meta_type="Dexterity FTI" name="interaction" />
<!-- -*- extra stuff goes here -*- -->
</object>
控制门户中可用的内容类型
为了完整起见,我还包括了相应的profiles/default/types/interaction.xml文件:
<?xml version="1.0"?>
<object name="interaction" meta_type="Dexterity FTI"
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
<property name="title">Interaction</property>
<property name="description">An item in the interactions dictionary</property>
<property name="icon_expr">string:${portal_url}/document_icon.png</property>
<property name="factory">interaction</property>
<property name="link_target"></property>
<property name="immediate_view">view</property>
<property name="global_allow">True</property>
<property name="filter_content_types">True</property>
<property name="allowed_content_types"/>
<property name="allow_discussion">False</property>
<property name="default_view">view</property>
<property name="view_methods">
<element value="view"/>
</property>
<property name="default_view_fallback">False</property>
<property name="add_permission">cmf.AddPortalContent</property>
<property name="klass">plone.dexterity.content.Item</property>
<property name="behaviors">
<element value="plone.app.dexterity.behaviors.metadata.IDublinCore"/>
<element value="plone.app.content.interfaces.INameFromTitle"/>
<element value="collective.flowplayer.behaviors.IFlowplayerFile"/>
</property>
<property name="schema">plonetheme.mytheme.interaction.IInteraction</property>
<property name="model_file"></property>
<alias from="(Default)" to="(dynamic view)"/>
<alias from="edit" to="@@edit"/>
<alias from="sharing" to="@@sharing"/>
<alias from="view" to="(selected layout)"/>
<action title="View" action_id="view" category="object" condition_expr=""
icon_expr="" link_target="" url_expr="string:${object_url}"
visible="True">
<permission value="View"/>
</action>
<action title="Edit" action_id="edit" category="object" condition_expr=""
icon_expr="" link_target="" url_expr="string:${object_url}/edit"
visible="True">
<permission value="Modify portal content"/>
</action>
</object>
相互作用
字典中的一项
字符串:${portal\u url}/document\u icon.png
相互作用
看法
真的
真的
假的
看法
假的
cmf.AddPortalContent
plone.dextrity.content.Item
plonetheme.Mysteme.interaction.I交互作用
当我转到交互自定义类型的添加表单时,我会得到一个标准的敏捷列表项添加/删除小部件,而不是我在collective.z3cform.datagrid_演示示例中看到的datagrid表小部件。当我试图保存自定义类型时,敏捷列表小部件显示一个验证错误“系统无法处理给定值”
我还需要添加其他代码吗?我是否需要覆盖“灵巧添加/编辑表单”视图模板?您正在按照文档所述进行操作,但它不起作用。这是一个已知的问题:
尝试使用灵巧表单提示:
...
from zope import schema
from zope.interface import Interface
from plone.directives import form
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
from plonetheme.mytheme import InteractionMessageFactory as _
...
class IFindingRow(Interface):
summary = schema.TextLine(title=_(u'Summary'),
required=False)
percentage = schema.TextLine(title=_(u'Percentage'),
required=False)
class IInteraction(form.Schema):
...
form.widget(findings=DataGridFieldFactory)
findings= schema.List(
title=_(u"Overview of findings"),
value_type=DictRow(title=_(u"Finding"),
schema=IFindingRow),
required=False,
)
这在Plone 5.0.4中适用于我
from zope import schema
from zope.interface import Interface
from plone.supermodel import model
from plone.autoform import directives
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow
from plonetheme.mytheme import InteractionMessageFactory as _
class IFindingRow(Interface):
summary = schema.TextLine(title=_(u'Summary'),
required=False)
percentage = schema.TextLine(title=_(u'Percentage'),
required=False)
class IInteraction(model.Schema):
directives.widget(findings=DataGridFieldFactory)
findings= schema.List(
title=_(u"Overview of findings"),
value_type=DictRow(title=_(u"Finding"),
schema=IFindingRow),
required=False,
)
你能不能也添加你的灵巧内容项类定义,让我们看看?我对Plone/Dextrity术语还是有点陌生。内容项类定义是profiles/default/types中的XML文件吗?我已经更新了我的帖子,现在包括这个。非常感谢。您的configure.zcml中有类似的行吗?否则,将找不到自定义编辑表单。编辑表单上的“字段”属性也可能被plone.autoform机制覆盖,这是通常根据内容类型的架构配置字段以显示的机制。是的,我的configure.zcml中有。我也尝试过添加一个自定义的编辑表单模板,但也没有被选中。名称为view.pt旁边的interaction\u templates/edit.pt。这是覆盖自动形成机制的正确方法吗?这将显示网格,但不会保存在网格中输入的值。