Plone 在创建内容时,我应该能够使用适配器来计算字段的内容吗?
我正在尝试创建一个报表内容类型,该类型包含一个时间间隔内自定义容器对象内容的时间点快照。我最终将使用列表存储额外的时间变量数据,因此在视图中及时生成列表将不太有效 我有一个报告的内容类型,其中包括时间间隔和一个用于保存容器内容引用列表的字段:Plone 在创建内容时,我应该能够使用适配器来计算字段的内容吗?,plone,adapter,zope,dexterity,Plone,Adapter,Zope,Dexterity,我正在尝试创建一个报表内容类型,该类型包含一个时间间隔内自定义容器对象内容的时间点快照。我最终将使用列表存储额外的时间变量数据,因此在视图中及时生成列表将不太有效 我有一个报告的内容类型,其中包括时间间隔和一个用于保存容器内容引用列表的字段: class IIssuesReport(form.Schema): report_begin_date = schema.Date( title=_(u"Report begin date"), ) rep
class IIssuesReport(form.Schema):
report_begin_date = schema.Date(
title=_(u"Report begin date"),
)
report_end_date = schema.Date(
title=_(u"Report end date"),
)
issues = RelationList(
title=_(u"Report Issues"),
description=_(u'Select Issues'),
default = [],
value_type=RelationChoice(
title=_(u'Issue'),
default=[],
source=ObjPathSourceBinder()
),
required=False,
)
我希望在提交表单时以编程方式填充“问题”字段。我相信我应该能够通过编写一个适配器来实现这一点,该适配器重写issues()属性setter以生成数据并将其分配给列表。我创建了一个带有工厂的“填充”类来覆盖问题属性设置器:
class IPopulatedIssuesReport(interface.Interface):
"""A list of issues.
"""
class PopulateIssuesReport(object):
""" Generate the IssuesReport issues from existing inventory
"""
implements(IPopulatedIssuesReport)
adapts(IIssuesReport)
def __init__(self, context):
self.context = context
@property
def issues(self):
import pdb; pdb.set_trace()
并注册了适配器工厂:
<adapter factory=".issuesReport.PopulateIssuesReport" />
:
当我创建IIssueReport内容时,我希望将其放入适配器中的调试器中,但没有发生,好像适配器从未执行过一样。我错过了什么?这是用我的站点中的现有数据填充此字段的正确方法吗 您应该在适配器中提供提供定义
试试这个
<adapter for="yourType.IIssuesReport"
factory=".issuesReport.PopulateIssuesReport"
provides=".issuesReport.IPopulateIssuesReport"
/>
IIssueReport接口是否需要作为一种行为才能正常工作?我不这么认为。有些地方仍然不对劲,因为这似乎不起作用。目前,我在同一issuereport.py文件中有IIssuesReport、IPopulatedIssuesReport和PopulateIssuesReport。也许这导致了冲突,使其无法工作。我将尝试将适配器拆分为一个单独的文件.create behaviors.py,并将这些代码移到其中。让我们看看这是否有效。因子和提供的适配器定义将从like.behaviors.PopulateIssuesReport
和.behaviors.IPopulateIssuesReport
开始移动适配器代码(接口和工厂)到a behaviors.py文件,仍然可以看到相同的行为:当我创建IISSueReport内容时,它完成了创建,但我希望适配器在调试器中运行并停止。其他想法我可能遗漏了什么?有没有办法让我看到适配器已注册并可用?非常感谢您的帮助。如果我能弄明白这一点,我需要把它变成一个简短的教程。为了简化,我创建了一个新项目,并从代码中去掉了我认为不重要的东西。我粘贴了所有的代码。不确定这是粘贴它的最佳方式(一次粘贴多个文件)。过去包含issuereport.py、profiles/default/types/issuereport.xml、interfaces.py、behaviors.py和configure.zcml。我正在使用Plone 4.1(在Ubuntu系统上运行)。我唯一没有尝试过的事情是注册一个行为并扩展该行为,因此这与修改INameFromTitle示例相同。我不认为这是一项要求,但也许有一个问题使这成为必要?