2012-07-26 14 views
18

soy nuevo en Jinja y FlaskJinja - ¿Hay alguna variable incorporada para obtener el nombre de la página HTML actual?

Quiero establecer diferentes colores de fondo en la barra de navegación para indicar la página actual.

¿Hay alguna variable o método Jinja integrado que devuelva las páginas HTML actuales? Si es posible, quiero el código que no necesita comunicarse con el archivo de Python.

Así que si estoy actualmente en index.html, devolverá "índice" o "index.html"

Aquí está mi código de navegación en mi plantilla:

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

Quiero añadir if declaración por lo que la página actual obtendrá <li> que tiene class

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

Gracias

+2

Posible duplicado de http://stackoverflow.com/q/11157631/388916 – Hubro

Respuesta

32

Hay un truco en el documento Jinja2 para su problema: http://jinja.pocoo.org/docs/tricks/

Si la lista es bastante simple, simplemente usando objeto de la petición, algo así:

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

Normalmente, escribo este fragmento de una macro con un argumento explícito para establecer 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 %} 

La lista será algo como:

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

Así que si usted tiene una página secundaria, que se extiende o se incluye la lista, se puede establecer como elemento activo:

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

en la parte superior de la página secundaria.

4

En la pirámide 1.5 no hay ningún método como request.endpoint en Flask.

Utilizamos filtro personalizado 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 

y en 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 

Quizás sea útil para alguien :)

Cuestiones relacionadas