Plone 4:如何获取短名称中带有连字符的子文件夹的上下文

2 投票
2 回答
1110 浏览
提问于 2025-04-17 07:09

我正在写一个Python脚本,用来把内容从另一个内容管理系统导入到Plone 4.1。由于一些原因,我是这样运行的:bin/instance run path/to/myscript

我想问的是,如何正确获取一个ID或短名称中带有连字符的文件夹的上下文。例如,从一个叫做mysite的Plone网站的根目录开始,我可以这样处理一个叫“sub-folder”的文件夹:

from Products.CMFCore.utils import getToolByName
urltool = getToolByName(app.mysite, "portal_url")
portal  = urltool.getPortalObject()
folder = getattr(portal, 'sub-folder')

但是如果我想在这个子文件夹里创建一个文件夹或页面,下面的代码就会报错:“AttributeError: sub”。

urltool = getToolByName(app.mysite.sub-folder, "portal_url")
portal  = urltool.getPortalObject()

而在新闻文件夹(没有连字符)上执行同样的操作则不会报错:

urltool = getToolByName(app.mysite.news, "portal_url")
portal  = urltool.getPortalObject()

直接尝试使用portal.sub-folder也会出现同样的错误。

那么,怎样的Python代码才能获取“http://localhost:8080/mysite/sub-folder”的正确上下文,这样我才能成功调用invokeFactory方法,在mysite/sub-folder里创建一个文件夹或页面呢?

如果我需要找到“http://localhost:8080/mysite/sub-folder/2nd-level”的上下文呢?

我找到的在线文档似乎只考虑了没有连字符的文件夹,比如dog或news。但是,如果你在Plone中手动创建这些项目,短名称显然是有连字符的,所以一定有办法获取正确的文件夹上下文。

2 个回答

0

你已经做到了:

folder = getattr(portal, 'sub-folder')

所以你有一个带有连字符的文件夹,正好在“folder”这个变量里。

你可以用这个folder变量来调用invokeFactory,这样就完成了。它知道在Plone中它的位置。

你不需要获取portal_url工具来运行invokeFactory。不过如果你想要的话,可以这样写:

getToolByName(app.mysite.sub-folder, "portal_url")

你也可以这样做:

getToolByName(folder, "portal_url")

不过现在(可能永远)你甚至不需要这样做,因为你子文件夹的portal_url工具和整个网站的那个是一样的,所以你可以直接写:

urltool = getToolByName(app.mysite, "portal_url")
4

这是因为如果你使用:

app.mysite.sub-folder

Python会认为你是在计算app.mysite.subfolder之间的差异。

其实你应该使用这个写法:

secondlevel = mysite['sub-folder']['2nd-level']

或者

secondlevel = mysite.restrictedTraverse('/mysite/sub-folder/2nd-level')

撰写回答