Plone 4:如何获取短名称中带有连字符的子文件夹的上下文
我正在写一个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 个回答
你已经做到了:
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")
这是因为如果你使用:
app.mysite.sub-folder
Python会认为你是在计算app.mysite.sub
和folder
之间的差异。
其实你应该使用这个写法:
secondlevel = mysite['sub-folder']['2nd-level']
或者
secondlevel = mysite.restrictedTraverse('/mysite/sub-folder/2nd-level')