Пользовательский обход и шаблоны страниц - PullRequest
0 голосов
/ 18 ноября 2009

Используя превосходное сообщение в блоге Мариуса Гедминаса , я создал специальный траверсер для папки на моем сайте.

Это позволяет мне показать: 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).

I не необходимо, чтобы представление было доступно через любой другой адрес ( Нет : 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"
/>

Ответы [ 3 ]

1 голос
/ 18 ноября 2009

Было бы проще ответить на ваш вопрос, если бы вы показали, что делает ваш пользовательский traverser.

По сути, вы хотите что-то вроде этого:

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 голосов
/ 18 ноября 2009

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

Требуется defaultView, поскольку для вашего объекта random_id не указано представление в вашем URL.

0 голосов
/ 18 ноября 2009

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

...