2012-07-26 19 views
18

Sono molto nuovo a Jinja e FlaskJinja - Esiste una variabile incorporata per ottenere il nome corrente della pagina HTML?

Desidero impostare un colore di sfondo diverso nella barra di spostamento per indicare la pagina corrente.

C'è qualche variabile o metodo Jinja incorporato che restituisce le pagine HTML correnti? Se possibile, voglio il codice che non ha bisogno di comunicare con il file Python.

Quindi, se io sono attualmente in index.html, verrà restituito "indice" o "index.html"

Ecco il mio codice di navigazione nel mio modello:

<ul> 
    {% for item in navigation %} 
     <a href="{{url_for(item.route)}}"> 
     <li> 
      {{item.text}} 
     </li> 
     </a> 
    {% endfor %} 
</ul> 

voglio aggiungere if dichiarazione in modo che la pagina corrente otterrà <li> che ha class

{% if ??? %} 
    <li class="current"> 
    ... 
    </li> 
{% else %} 
    ... 
{% endif %} 

Thank You

+2

Eventuale duplicato di http://stackoverflow.com/q/11157631/388916 – Hubro

risposta

32

C'è un trucco nel documento Jinja2 per il vostro problema: http://jinja.pocoo.org/docs/tricks/

Se l'elenco è abbastanza semplice, usando solo richiesta di oggetto, una cosa del genere:

<li {% if request.endpoint == item.endpoint %} class='active' {% endif %}> 
    <a href="{{url_for(endpoint)}}">{{item.text}}</a> 
</li> 

Normalmente, scrivo questo frammento di una macro con un argomento esplicito per impostare active:

{% macro render_sitem(endpoint, display, cls='', icon-cls='', active='') %} 
<li {% if request.endpoint == endpoint or active == endpoint %} class='active' {% endif %}> 
    <a class='{{cls}}' href="{{url_for(endpoint)}}"><i class="{{icon-cls}}"></i> {{display}}</a> 
</li> 
{% endmacro %} 

L'elenco sarà qualcosa di simile:

<ul class="nav nav-list"> 
    {{render_sitem('page.index', _('Pages'), icon-cls='icon-sitemap', active=active_page)}} 
    {{render_sitem('post.index', _('Posts'), icon-cls='icon-file', active=active_page)}} 
    {{render_sitem('user.index', _('Users'), icon-cls='icon-group', active=active_page)}} 
</ul> 

Quindi, se si dispone di una pagina figlio che si estende o comprende la vostra lista, è possibile impostare la voce attiva come:

{% set active_page = 'page.index' %} 

nella parte superiore della pagina figlio.

4

Nella piramide 1.5 non ci sono metodi come request.endpoint in Flask.

Usiamo filtro personalizzato get_endpoint

request.path | get_endpoint

jinja2_custom_filters.py:

from pyramid_jinja2 import Environment 

def get_endpoint(str): 
    """ 

    :param str: 
    :return: 
    """ 
    return str.split('/')[-1] 


env = Environment() 
env.filters['get_endpoint'] = get_endpoint 

e in development.ini:

jinja2.filters = 
    model_url = pyramid_jinja2.filters:model_url_filter 
    route_url = pyramid_jinja2.filters:route_url_filter 
    static_url = pyramid_jinja2.filters:static_url_filter 
    get_endpoint = path to ... jinja2_custom_filters.get_endpoint 

Forse sarà utile a qualcuno :)

Problemi correlati