在创建内容时,我是否应该能够使用适配器来计算字段的内容?

时间:2014-01-08 13:37:29

标签: plone adapter zope dexterity

我正在尝试创建一个报表内容类型,其中包含一段时间内自定义容器对象内容的时间点快照。我最终会在列表中存储额外的时间变量数据,因此在视图中即时生成列表将不会很有效。

我有一个报告的内容类型,其中包含时间间隔和一个用于保存容器内容引用列表的字段:

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" />

我在其他关于调整INameFromTitle以使用其他单独字段的帖子之后构建了大部分内容,特别是DavidJB's post

当我创建我的IIssueReport内容时,我希望将其放入适配器中的调试器中,但它不会发生,就像适配器永远不会被执行一样。我错过了什么?这是使用我网站的现有数据填充此字段的正确方法吗?

1 个答案:

答案 0 :(得分:1)

您应该在适配器中提供provides定义。

试试这个!!

<adapter for="yourType.IIssuesReport"
         factory=".issuesReport.PopulateIssuesReport"
         provides=".issuesReport.IPopulateIssuesReport"
       />