2011-04-02 14 views
13

¿Cuál es el equivalente del contexto de la plantilla en Pyramid?Equivalente al contexto de la plantilla en Pyramid (usuarios de pilones)

¿El evento IBeforeRender en pirámide tiene algo que ver con esto? He revisado la documentación oficial pero me cuesta entender qué es exactamente el evento IBeforeRender.

+0

Pregunta extraña ... ¿qué tiene que ver IBeforeRender con el contexto de la plantilla? –

+0

Lo siento, pensé que tal vez el equivalente de la plantilla Conext en Pyramid, pero supongo que es otra cosa. – sidewinder

+0

Pregunta en la lista de correo de Pylons para obtener ayuda de las personas de Pylons. –

Respuesta

11

pirámide ya proporciona un tmpl_context en su solicitud objeto, de manera bastante simple sólo hay que suscribir un evento BeforeRender para añadirlo a las variables globales renderer:

def add_renderer_globals(event): 
    event['c'] = request.tmpl_context 
    event['tmpl_context'] = request.tmpl_context 

config.add_subscriber(add_renderer_globals, 'pyramid.events.BeforeRender') 

De ahora en adelante en su código cuando se recibe una solicitud, puede establecer los parámetros en él:

request.tmpl_context.name = 'Bob' 

y, posteriormente, la plantilla puede hacer referencia a la variable de name:

${ c.name } 
+0

Esto también es excelente. Gracias. – sidewinder

+0

'Request.tmpl_context' ya no está documentado y ya está visible en las plantillas como' c' - vea mi [respuesta] (http://stackoverflow.com/a/35443664/95735). –

1

Pyramid realmente no expone el "contexto de la plantilla" al desarrollador (aunque se usa internamente en los diversos enlaces de motor de plantilla para Pyramid).

Normalmente, si quiere meter algo en "c" para usar dentro de una plantilla, simplemente páselo como argumento de palabra clave a la llamada render_to_response() o como parte del dict que devuelve con un procesador predefinido.

Así que para hacer algo similar como http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global puede hacer:

@view_config(renderer="greeting.mako") 
def index(request): 
    return {'name': 'Pyramid Developer'} 

Y greeting.mako:

<html> 
<head> 
    <title>Greetings</title> 
</head> 
<body> 
    <h1>Greetings</h1> 
    <p>Hello ${name}!</p> 
</body> 
</html> 
6

Si por el contrario usted está esperando para algunos "bolsa global" donde se puede rellenar las variables que estará disponible para cada plantilla, entonces su pregunta sobre IBeforeRender es apropiada.

from pyramid.events import subscriber 
from pyramid.events import BeforeRender 

@subscriber(BeforeRender) 
def add_global(event): 
    event['name'] = 'Pyramid Developer' 

Existe una forma alternativa de agregar valores globales al configurar también el Configurador. Se puede ver la información completa en: http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

+0

Tenga en cuenta que el "bolso global" estaba g en Pylons. Eso es diferente al contexto por solicitud tmpl_context/c. –

+0

Sus respuestas han sido muy útiles. Muchas gracias. – sidewinder

-1

Si usted está buscando un diccionario mundial para pasar convenientemente las variables volver & vuelta entre plantillas y puntos de vista, utilizar pyramid.request.TemplateContext

En la página de la plantilla:

<%! 
    from pyramid.request import TemplateContext as c 
    c.foo = 123 
%> 

Luego puede acceder a la variable importando TemplateContext en sus vistas de la misma manera:

from pyramid.request import TemplateContext as c 

Esto debería ser más o menos el equivalente de tmpl_context en pilones.

2

Me parece que las soluciones anteriores no copian exactamente el comportamiento del contexto de la plantilla de Pylons. Si se procesa una solicitud de página en Pilones y se agrega algún valor a al contexto c, se puede acceder a ella en la plantilla como c.a. Sin embargo, si se procesa otra solicitud, esta clave/valor se eliminará.

Las soluciones de Pyramid anteriores muestran otro comportamiento. la clave/valor c.a se mantendrá en el contexto de la plantilla. A veces, esto no es deseado. ¿Hay alguna sugerencia para arreglar esta diferencia?

+0

Sí, en lugar de utilizar el evento ** global ** El pase 'BeforeRender' solicita variables específicas para el renderizador o las usa al representar su respuesta directamente. * En Pyramid, devuelve un dict de variables y deja que el procesador las aplique a una plantilla. O puede renderizar una plantilla usted mismo en el código de vista. * - de [Pylons magic globals] (http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/pylons/request.html#pylons-magic- global) sección de * Pyramid Cookbook *. –

0

De Pylons magic globals sección del libro de cocina Pirámide:

Pilones tiene varias variables globales mágicos que contienen los datos del estado de la solicitud actual . Estos son los equivalentes más cercanos de la pirámide:

(...)

pylons.tmpl_context

Un objeto cero para los datos de solicitud local, por lo general se utiliza para pasar varables a la plantilla. En Pyramid, devuelve un dict de variables y deja que el renderizador las aplique a una plantilla. O puede renderizar una plantilla usted mismo en el código de vista.

Si la vista es un método, también puede establecer variables de instancia. La instancia de vista es visible como view en plantillas. Hay dos cses de uso principal para esto. Uno, para establecer las variables para la plantilla del sitio que de otra manera tendría que estar en cada dict de retorno . Dos, para las variables que son específicas para la representación HTML, cuando la vista se registra con un representador HTML y un representador no HTML (por ejemplo, JSON).

Pyramid tiene un puerto de "tmpl_context" en request.tmpl_context, que es visible en plantillas como c. Sin embargo, nunca se ha contagiado entre los usuarios de Pyramid-Pylons y ya no está documentado.

Cuestiones relacionadas