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示例相同。我不认为这是一项要求,但也许有一个问题使这成为必要?