2013-07-23 15 views
5

Załóżmy, że mam szablon podstawowy z nagłówkiem, a zawartość tego nagłówka musi zostać przekazana do szablonu.Jinja2 i Flask: Przekaż zmienną do szablonu nadrzędnego bez przekazywania jej dzieciom

<header> 
    You are logged in as {{ name }} 
</header> 

Ten szablon podstawowy zostaje rozszerzony o wiele stron. Jak mogę przekazać tę zmienną bez przekazywania jej każdemu dziecku? Na przykład nie chcę tego robić:

render_template("child1.html", name=user.name) 
render_template("child2.html", name=user.name) 
render_template("child3.html", name=user.name) 
etc... 

ponieważ kto wie, ile stron dziecięcych mogę mieć. To nie jest wystarczająco suche.

Nigdy nie renderuję szablonu podstawowego, tylko jego dzieci, ale nie wiem, jak inaczej przekazywać dane.

Czy istnieje sposób, aby to zrobić? Czy nie powinienem używać dziedziczenia?

Odpowiedz

9

Może proponuję użyć zmiennej globalnej "g" w kolbie. Jest to domyślnie dostępne w szablonach jinja. Nie musisz więc martwić się o to, że przekażesz go w dowolnym miejscu szablonu podstawowego lub dzieci. Tylko pamiętaj, aby ustawić go najpierw podczas logowania

g.username = user.name 

następnie w szablonach, po prostu to zrobić:

You are logged in as {{ g.username }} 
+1

Najnowsza wersja kolby (wydaje mi się, że począwszy od 0.10) error: 'RuntimeError: działa poza kontekstem aplikacji'. Ktoś wie, jak sobie z tym poradzić? –

1

Trzeba użyć kolby za context-processors:

@app.context_processor 
def inject_user(): 
    return dict(user=g.user) 

zobaczyć ten podobny SO question and answer .

Przykładem jak używam go (po prostu wstawić ustawienia app config):

@app.context_processor 
def lib_versions(): 
    return dict(
     bokehversion = app.config['BOKEH_VERSION'], 
     jqueryversion = app.config['JQUERY_VERSION'], 
     jqueryuiversion = app.config['JQUERYUI_VERSION'], 
     bootstrapversion = app.config['BOOTSTRAP_VERSION'], 
    ) 

które są pobierane z mojego Kolby pliku konfiguracyjnym:

class Config(object): 
    DEBUG = True 
    TESTING = True 
    SQLALCHEMY_DATABASE_URI = '' 
    TMP_DIR = '' 
    STATIC_FOLDER = '' 
    BOKEH_VERSION = '0.8.2' 
    JQUERY_VERSION = '1.11.2' 
    JQUERYUI_VERSION = '1.11.4' 
    BOOTSTRAP_VERSION = '3.3.4' 

class ProductionConfig(Config): 
    DEBUG = False 
    TESTING = False 

wtedy nazywamy je w swojej szablon bazowy tak jak każda inna zmienna Jinja2:

<!-- START: CSS --> 
<link rel="stylesheet" media="screen" type="text/css" href="http://cdn.pydata.org/bokeh/release/bokeh-{{ bokehversion }}.min.css"> 
<!-- END: CSS --> 
<!-- START: JS --> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/{{ jqueryversion }}/jquery.min.js"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/{{ jqueryuiversion }}/jquery-ui.min.js"></script> 
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/{{ bootstrapversion }}/js/bootstrap.min.js"></script> 
<!-- END: JS -->