2012-01-23 8 views
18

Y at-il quelque chose comme .net MVC 3 vue partielle dans la fiole?
Je veux incorporer un widget dans une page de vue, et ce widget a sa propre logique.Flask vue partielle comme MVC 3

+0

Vous pouvez écrire le code du widget dans une fonction et appeler cette fonction depuis une vue, n'est-ce pas suffisant? –

+0

@Alex Morega comment appeler le functin dans jinja2 Voir le modèle? – magicshui

+0

@magicshui Vous le passez dans render_template comme argument ... – plaes

Répondre

23

Il existe plusieurs façons d'inclure du contenu dans un modèle Jinja2:

La déclaration include va rendre la vue fournie (avec le contexte actuel par défaut):

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

Vous pouvez également définir macros et import les dans le modèle de vue:

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

deux import et include peut utiliser des variables, donc quelque chose comme cela est possible:

# 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 
#} 

Ces deux fonctionnent de façon similaire à une vue partielle de MVC (au moins, dans la mesure où je les comprends)

Alternativement, si votre widget doit avoir accès à ACLs ou des informations qui ne devraient pas être disponibles pour le calque de modèle et vous ne pouvez pas réécrire votre vue pour profiter de include et import vous pouvez prendre la suggestion de @ [Alex Morega] et passer un appelable comme une variable au modèle et de rendre là-bas.

# 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 ... #} 

Vous pouvez même créer votre propre template loader et charger différents modèles en fonction de presque quoi que ce soit. Mais ce serait certainement exagéré pour cette affaire.