2009-11-17 4 views
0

Используя Marius Gedminas's 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 вид щий для типа объекта (Dict в данном случае), который возвращается:

<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

Yup, это сработало так, как вам было предложено - хотя в конце концов я использовал следующее, прежде чем вы ответили, что похоже - но это messier/hackier: return getMultiAdapter ((self.context [name], self.request) имя = u'read ') <браузер: DefaultView для = "persistent.dict.PersistentDict" имени = "читать" /> <браузер: страница для = "persistent.dict.PersistentDict" имени = "читать" template = "read.pt" разрешение = "zope.ManageContent" /> –

0

Если вы в конечном итоге на надлежащем объект с настраиваемым транспортером, вы можете просто липкости на имя шаблона и пользовательский «контекст» в этом шаблоне. Итак, http://foo.com/folder/random_id/my_template и в шаблоне сделайте обычный материал <h1 tal:content="context/title" />.

+0

Я хочу установить шаблон через Python, избегая добавления чего-либо к пути, если можно. –

0

IIUC, то, что вы хотите, это визуализировать представление «читать», когда кто-то запрашивает/папку/random_id. Если это так, все, что вам нужно сделать, это заставить ваш обход вернуть объект (возможно, IFolderContent), представляющий random_id, и указать страницу «view» как defaultView для IFolderContent.

По умолчаниюView необходим, потому что для объекта random_id в вашем URL-адресе нет никакого представления.

+0

Это был бы «правильный» способ сделать это - с самого начала у объекта должен был быть интерфейс, но добавление его теперь будет включать в себя довольно неприятные поколения. –

Смежные вопросы