Frasco vista parcial como MVC 3

¿Hay algo 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.

Hay varias formas de incluir contenido en una plantilla Jinja2:

La statement de include representará la vista suministrada (con el contexto actual de forma predeterminada):

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

También puede definir macros e importarlas 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 las import como las que se include pueden usar variables, por lo 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 #} 

Ambos funcionan de manera similar a las vistas parciales de MVC (al menos, en la medida en que los entiendo)

Alternativamente, si su widget necesita 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 la include e import , puede tomar la sugerencia de @ [Alex Morega] y pasarla. puede llamarse como variable a la plantilla y representarla 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 ... #} 

Incluso podría crear su propio cargador de plantillas y cargar diferentes plantillas dependiendo de casi cualquier cosa . Pero eso definitivamente sería una exageración para este caso.