Plantillas de páginas y recorridos personalizados
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"
/>
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.