2012-01-23 26 views
18

¿Hay algo así como la vista parcial de .net MVC 3 en el matraz?
Quiero incrustar un widget en una página de vista, y ese widget tiene su propia lógica.Vista parcial del matraz como MVC 3

+0

Puede escribir el código del widget en una función y llamar a esa función desde una vista, ¿no es suficiente? –

+0

@Alex Morega cómo llamar a la función en la plantilla de vista jinja2? – magicshui

+0

@magicshui Lo pasas a render_template como argumento ... – plaes

Respuesta

23

Hay varias maneras de incluir el contenido en una plantilla Jinja2:

La declaración include rendirá la vista suministrado (con el contexto actual por defecto):

{# In your_view_template.jinja #} 
{# ... your code ... #} 
{% include "widgets/your_widget.jinja" %} 
{# ... your code ... #} 

También puede definir macros y import ellos en la plantilla de vista:

{# In your_view_template.jinja #} 
{% import "widgets/your_widget.jinja" as your_widget %} 
{# ... your code ... #} 
{{ you_widget.render(your, important, variables, etc.) }} 
{# ... your code ... #} 

Tanto import y 0.123.puede utilizar variables, así que algo como esto es posible:

# In your view 
if complex_conditions.are_true(): 
    widget = "widgets/special_custom_widget.jinja" 
else: 
    widget = "widgets/boring_widget.jinja" 
render_template("your_view.jinja", widget=widget) 

{# In your_view_template.jinja #} 
{% include widget %} 
{# 
import widget as sidebar_widget 
{{ sidebar_widget.render() }} 
would also work 
#} 

Estos ambos funcionan de manera similar a las vistas parciales de MVC (al menos, en tanto que los entiendo)

Alternativamente, si el widget necesita tener acceso a las ACL o información que no debería estar disponible para la capa de plantilla y no puede volver a escribir su vista para aprovechar include y import puede tomar la sugerencia de @ [Alex Morega] y pasar un invocable como variable a la plantilla y renderizar allí.

# In your view 
render_template("your_view.jinja", widget=you_callable, etc, etc, etc) 

{# In your_view_template.jinja #} 
{# ... your code ... #} 
{{ widget() }} 
{# Or, if you are returning HTML that is not a Markup construct #} 
{{ widget() | safe }} 
{# ... your code ... #} 

Se podría incluso crear su propia template loader y cargar diferentes plantillas en función de casi nada . Pero eso definitivamente sería excesivo para este caso.

Cuestiones relacionadas