在plone中的另一个项目的选择字段中列出已创建项目的标题

Listing the title of created items in a choice field of another item in plone

我无法解决我的 Plone 项目问题。 'Car' 应该创建 'Colour' 所有实例的列表。 所有 'Colour' 个实例都在给定的容器中。我不能将其设为静态,因为我想在将来添加更多 'Colour' 个实例。 我尝试选择容器中的每个项目并将其添加到我的词汇表中。我只需要 object 的 id/title,但我总是以大量的失败堆栈跟踪告终。 最后,我想在创建类似于下拉列表的新 'Car' 实例时从给定实例中选择一种颜色。 我已阅读文档但找不到解决方案,这是我最好的主意。 我也不是 python 程序员,这是我的第一个 plone 项目。如果您需要,我可以稍后添加完整的故障列表。

感谢您提供的每一点帮助。谢谢。

 ```colour= schema.Choice(
       title=u"Colour",
       description=u"Paintjob",
        vocabulary=givecolour(),
        required=False
    )

    @provider(IContextSourceBinder)
        def givecolour():
        colourlist = self.context.portal_catalog(path={"query" : "/madb-entw/it/colourcontainer", "depth" : 1})
        list = []
        i = 0

        for colour in colourlist:
            list.append(
                    SimpleVocabulary.createTerm(
                        colourlist.[i].getObject().id
                    )
            )
            i += 1

        return SimpleVocabulary(list)```

请随时添加您的踪迹,以便我们更好地帮助您。 还有官方community.plone.org论坛,那里有更多人可以帮助你。

我建议你使用 plone.api 来查找你的对象,这更容易一些并且有据可查。

像这样:

from plone import api
color_brains = api.content.find(context=api.content.get(path='/madb-entw/it/colourcontainer'), depth=1, portal_type='Color')
# no need to do getOject() here, get the id/title directly from the catalog brain
colors = [(color.id, color.Title) for color in color_brains]

请注意您的查询:

colourlist = self.context.portal_catalog(path={"query" : "/madb-entw/it/colourcontainer", "depth" : 1})

路径必须是绝对路径,这意味着它包含 Plone 站点 ID,并且在另一个 Plone 站点中可以不同。 所以绝对路径在这里不是一个好主意,最好获取门户对象并从那里遍历你的相对路径。 如果 madb-entw 是你的 Plone 站点 id:

portal.restrictedTraverse('it/colourcontainer')

或如上更好,使用 plone.api.content.get(path='/it/colourcontainer') 哪个更干净,更容易。