2009-11-17 146 views
0

使用Marius Gedminas的excellent blog post,我爲我的站點中的文件夾創建了自定義遍歷器。自定義遍歷和頁面模板

這讓我顯示: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() 

但我不能解決如何在自定義遍歷的上下文中正確執行此操作。


UPDATE:要清楚,我想避免添加任何東西到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') 

甚至一個DEFA

<browser:page 
    for="dict" 
    name="read" 
    template="read.pt" 
    permission="zope.ManageContent" 
/> 

回答

1

如果你展示了你的自定義遍歷器正在做什麼,回答你的問題會更容易。

本質上講,你想是這樣的:

def publishTraverse(self, request, name): 
    if name in self.context: 
     return MyMessageView(self.context[name], request) 

    # fall back to views such as index.html 
    view = queryMultiAdapter((self.context, request), name=name) 
    if view is not None: 
     return view 

    # give up and return a 404 Not Found error page 
    raise NotFound(self.context, name, request) 

其中MyMessageView可以像

class MyMessageView(BrowserPage): 
    __call__ = ViewPageTemplateFile('read.pt') 

免責聲明簡單的東西:我不知道,如果你直接實例化的視圖將被保護通過安全包裝;確保你的功能測試確保匿名用戶無法查看消息,如果這是你想要的。

+0

是的,這個按照你的建議工作 - 雖然我最終在你回答之前使用了以下內容,但它是相似的 - 但是更加混亂/ hackier: return getMultiAdapter((self.context [name],self.request),名= u'read') <瀏覽器:默認視圖 用於= 「persistent.dict.PersistentDict」 名稱= 「讀」 /> <瀏覽器: 頁= 「persistent.dict.PersistentDict」 名=「讀」 template =「read.pt」 permission =「zope.ManageContent」 /> – 2009-11-18 15:31:04

0

如果你在適當的對象最終獲得您的自定義遍歷器,你可以粘在模板名稱和用戶「上下文」:針對要返回的對象類型(在這種情況下,一個字典)ULT視圖在該模板中。所以http://foo.com/folder/random_id/my_template和在模板中做正常<h1 tal:content="context/title" />的東西。

+0

我想通過Python設置模板,如果可以的話,避免添加任何東西到路徑。 – 2009-11-18 10:00:11

0

IIUC,你想要的是當有人請求/文件夾/ random_id時呈現'閱讀'視圖。如果是這樣的話,你所需要做的就是讓你的遍歷返回一個表示random_id的對象(IFolderContent,也許),並將'view'頁面指定爲IFolderContent的defaultView。

defaultView是需要的,因爲沒有爲您的URL中的random_id對象指定視圖。

+0

這將是「正確」的方式 - 從一開始,對象應該有一個接口 - 但現在增加一個會涉及一些相當惡劣的世代。 – 2009-11-18 15:27:30