2012-08-09 16 views
5

Tengo definidas algunas macros que se invocan desde varias plantillas.¿Cómo hacer una macro Jinja2 desde una vista invocable?

Por ejemplo, la página del producto tiene una sección de revisión que utiliza las macros definidas en 'helpers/review.jinja2' para imprimir cada revisión. El archivo 'helpers/review.jinja2' tiene estas dos macros:

{% macro render_review(request,review) -%} 
{% macro render_review_comment(request,comment) -%} 

Cuando alguien presente una nueva revisión, a través de AJAX, quiero devolver la revisión dictada con el fin de añadir el contenido a la sección de revisión.

En este momento, tengo una plantilla intermedia 'review/review.jinja2' que tiene este aspecto:

{% import 'helpers/review.jinja2' as review_helper %} 
{{ review_helper.render_review(request,review) }} 

Esta plantilla se hace de la vista:

@view_config(route_name='review.add_review', renderer='review/review.jinja2') 
def add_review(request): 
    return dict(review=my_new_review) 

Pero espero que hay una mejor manera de hacerlo esta. Entonces, ¿es posible renderizar una macro definida en una plantilla?

Gracias

+0

que acabo de hacer una búsqueda rápida a través de d Jinja2 ocs y no parece que haya ninguna manera de hacer esto. –

Respuesta

3

La solución realidad se pueden encontrar en otro de los proyectos de Armin - Frasco implementa un método get_template_attribute (ver here para la fuente del método). Esto nos señala en la clase Template de Jinja2, más específicamente, la clase Template 'module attribute.

No sé si el procesador predeterminado de Pyramid para Jinja2 expone esa funcionalidad para usted, pero debería ser posible crear y registrar un renderizador personalizado si el predeterminado no le permite hacer algo como esto (totalmente teórico):

@view_config(route_name='review.add_review', 
       renderer='helpers/review.jinja2:render_review') 
def add_review(request): 
    return dict(review=my_new_review) 
+0

No funcionó con la pirámide simple. Parece complicado, pero lo intentaré una vez más: D –

Cuestiones relacionadas