Marius Gedminas の優れたブログ投稿を使用して、サイト内のフォルダー用のカスタム トラバーサーを作成しました。
これにより、次のことを示すことができます。http://foo.com/folder/random_id
それ以外の:http://foo.com/folder/object.html?id=random_id
構成側はうまく機能します。random_ids をキャッチし、メッセージを検索して正しいメッセージを表示する準備ができています。
私の問題は、通常のページテンプレートを介してデータを表示する方法がわからないことです-元のコードのTODOポイントで;)
if name == 'mycalendar':
mycalendar = ... # TODO: do something to get the appropriate object
return mycalendar
通常、次のようなものを使用します。
class Test(BrowserPage):
template = ViewPageTemplateFile('atest.pt')
def __call__(self):
return self.template()
しかし、カスタム トラバーサルのコンテキストでこれを正しく行う方法がわかりません。
更新:明確にするために、URLに何かを追加することは避けたい(いいえ: http://foo.com/folder/random_id/read )。
他のアドレスからビューを利用できるようにする必要はありません (いいえ: http://foo.com/folder/read )
使用したいビューの ZCML は次のとおりです。
<browser:page
for="foo.interfaces.IFooFolderContainer"
name="read"
template="read.pt"
permission="zope.ManageContent"
/>
私は(さらなるアドバイスに基づいて)次のように推測しています:
return getMultiAdapter((mycalendar, self.request), IPageTemplate, name=u'read')
または、返されるオブジェクト タイプ (この場合は dict) の既定のビューです。
<browser:page
for="dict"
name="read"
template="read.pt"
permission="zope.ManageContent"
/>