2012-01-23 11 views
18

Esiste qualcosa come. La vista parziale di MVC 3 in un pallone?
Desidero incorporare un widget in una pagina di visualizzazione e tale widget ha una propria logica.Visualizzazione parziale del pallone come MVC 3

+0

È possibile scrivere il codice del widget in una funzione e chiamare tale funzione da una vista, non è sufficiente? –

+0

@Alex Morega come chiamare la funzione nel modello di visualizzazione jinja2? – magicshui

+0

@magicshui Passalo in render_template come argomento ... – plaes

risposta

23

Ci sono diversi modi per includere il contenuto in un modello Jinja2:

La dichiarazione include visualizzerà la vista in dotazione (con l'attuale contesto di default):

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

È anche possibile definire macros e li import nel modello di 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 ... #} 

Sia import e 0.123.possibile utilizzare le variabili, in modo da qualcosa di simile a questo è possibile:

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

Questi entrambi funzionano in modo simile a una vista parziale di MVC (almeno, in quanto li capisco)

In alternativa, se il tuo widget ha bisogno di accedere alle ACL o informazioni che non dovrebbero essere disponibili per il livello template e non puoi riscrivere la tua vista per sfruttare include e import puoi prendere il suggerimento di @ [Alex Morega] e passare un callable come variabile al template e renderizzare è lì.

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

Si potrebbe anche creare il proprio template loader e caricare i modelli differenti a seconda quasi nulla . Ma sarebbe sicuramente eccessivo per questo caso.

Problemi correlati