虽然您可以使用以下划线开头的id来生成代码内容,但是" _foo"似乎您无法遍历具有此特殊ID的项目.每次尝试使用浏览器访问以此方式命名的内容都会导致NotFound错误.这两种方法都不喜欢__bobotraverse__或被__getitem__调用,比如很早就检查了这个限制.
此限制如何工作以及如何更改?我可以访问ID中带有前缀下划线的子对象吗?
在unrestrictedTraverse实现内部找到OFS.Traversable:
if name[0] == '_':
# Never allowed in a URL.
raise NotFound, name
Run Code Online (Sandbox Code Playgroud)
......但这还不够.还有一个类似于@Mathias ZPublisher.BaseRequest.DefaultPublishTraverse在publishTraverse方法中通知的检查.
if name[:1]=='_':
raise Forbidden("Object name begins with an underscore at: %s" % URL)
Run Code Online (Sandbox Code Playgroud)
可悲的是,重写这个并不简单:
unrestrictedTraversePlone站点上下文中调用(因此我无法仅为我的内容类型自定义它)publishTraverse方法归请求实现所有(为此我可以使用广告自定义发布遍历器?)修复此问题的最简单方法似乎是通过monkeypatch.