2012-07-26 11 views
18

Ich bin sehr neu zu Jinja und FlaskJinja - Gibt es eine eingebaute Variable, um den aktuellen HTML-Seitennamen zu erhalten?

Ich möchte verschiedene Hintergrundfarbe in der Navigationsleiste, um die aktuelle Seite anzuzeigen.

Gibt es eine integrierte Jinja-Variable oder -Methode, die aktuelle HTML-Seiten zurückgibt? Wenn möglich, möchte ich den Code, der nicht mit der Python-Datei kommunizieren muss.

Also, wenn ich zur Zeit in index.html, wird es zurückgeben "Index" oder "index.html"

Hier ist mein Navigationscode in meiner Vorlage:

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

Ich möchte if Anweisung hinzufügen so die aktuelle Seite <li> erhalten, hat class

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

Danke

+2

Mögliche Duplikat von http://StackOverflow.com/Q/11157631/388916 – Hubro

Antwort

32

Es gibt einen Trick in jinja2 Dokument für Ihr Problem ist: http://jinja.pocoo.org/docs/tricks/

Wenn Ihre Liste ist einfach genug, nur Request-Objekt verwenden, so etwas wie die:

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

Normalerweise schreibe ich dieses Snippet

{% 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 %} 

Die Liste so etwas wie sein: ein Makro mit einem expliziten Argumente active setzen

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

Also, wenn Sie ein Kind Seite haben, die oder enthält die Liste erweitert, können Sie aktive Element gesetzt wie:

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

in der Spitze Ihres Kindes Seite.

4

In Pyramide 1.5 gibt es keine Methode wie request.endpoint in Flask.

Wir verwenden, um benutzerdefinierte Filter 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 

und 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 

Vielleicht wird es für jemanden nützlich sein :)

Verwandte Themen