Pregunta

Usando el de Marius Gedminas excelente publicación de blog, He creado un recorrido personalizado para una carpeta en mi sitio.

Esto me permite mostrar: http://foo.com/folder/random_id

En lugar de: http://foo.com/folder/object.html?id=random_id

El lado de configuración funciona muy bien, puedo capturar los random_ids y buscar en mis mensajes el correcto, listo para mostrar.

Mi problema es que no estoy seguro de cómo mostrar los datos a través de mis plantillas de página habituales, en el punto TODO de su código original;)

if name == 'mycalendar':
            mycalendar = ... # TODO: do something to get the appropriate object
            return mycalendar

Normalmente usaría algo similar a:

class Test(BrowserPage):

    template = ViewPageTemplateFile('atest.pt')

    def __call__(self):
        return self.template()

Pero no puedo encontrar la manera de hacer esto correctamente en el contexto del recorrido personalizado.


ACTUALIZAR:Para ser claro quiero evitar agregando cualquier otra cosa a la URL (No: http://foo.com/folder/random_id/read).

I no Necesita que la vista esté disponible a través de cualquier otra dirección (No: http://foo.com/folder/read)

El ZCML para la vista que me gustaría usar es:

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

Supongo (con más consejos), algo como:

return getMultiAdapter((mycalendar, self.request), IPageTemplate, name=u'read')

O incluso una vista predeterminada para el tipo de objeto (un dict en este caso) que se devuelve:

<browser:page
  for="dict"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>
¿Fue útil?

Solución

Sería más fácil responder a su pregunta si usted mostró lo que su traviesa que está haciendo costumbre.

En esencia, usted quiere algo como esto:

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)

donde MyMessageView puede ser algo tan simple como

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

Renuncia: No estoy seguro de si la vista se crea directamente estará protegido por una envoltura de seguridad; asegúrese de que sus pruebas funcionales aseguran a los usuarios anónimos no puedan ver los mensajes, si eso es lo que desea.

Otros consejos

Si termina en un objeto adecuado con su traverser personalizada, puede simplemente añadir el nombre de la plantilla y el usuario "contexto" en esa plantilla. Así http://foo.com/folder/random_id/my_template y en la plantilla de hacer las cosas normales <h1 tal:content="context/title" />.

IIUC, lo que quiere es hacer que el 'leer' la vista cuando alguien solicita / carpeta / random_id. Si ese es el caso, todo lo que necesita hacer es hacer su recorrido devolver un objeto (IFolderContent, tal vez) que representa una random_id y especificar la página de 'vista' como el defaultView para IFolderContent.

El defaultView es necesario porque no hay vista especificada para el objeto random_id en su URL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top