2011-12-30 21 views
49

En una plantilla, ¿cómo obtengo la página en la que me encuentro actualmente? Prefiero no pasar una variable como page, especialmente cuando sé que algunos request.xxx pueden proporcionarme la información.Frasco: página actual en la variable de solicitud

<li {% if page=="home" %}class="active"{% endif %}>     
    <a href="/">Home</a>             
</li>                 
<li {% if page=="about" %}class="active"{% endif %}>     
    <a href="/about">About</a>           
</li> 

Respuesta

50

Mientras que haya importado request, request.path debe contener esta información.

+3

Tenga en cuenta que esto no es cierto para otras variables. Funciona porque 'request' es una de las variables [insertado por defecto] (http://flask.readthedocs.org/en/latest/templating/#standard-context) en el contexto de la plantilla. –

42

Primera solicitud de importación desde el matraz en su aplicación. A continuación, puede utilizarlo sin pasar a la plantilla:

<li {%- if request.path == "/home" %} class="active"{% endif %}> 
    <a href="/">Home</a> 
</li> 
<li {%- if request.path=="/about" %} class="active"{% endif %}> 
    <a href="/about">About</a> 
</li> 
+0

'solicitud' importado (en el archivo' * .py'), sigue recibiendo el error: jinja2.exceptions.UndefinedError: 'request' no está definido –

36

Usando request.path no parece ser un enfoque adecuado, ya que tendrá que actualizar las rutas en caso de cambio de las reglas de URL o el despliegue de su sitio bajo una subcarpeta

Uso request.url_rule.endpoint su lugar, contiene el nombre del extremo real independiente de la trayectoria real:

(Pdb) request.url_rule.endpoint 
'myblueprint.client_pipeline' 

En una plantilla:

<li {% if request.url_rule.endpoint == "myblueprint.client_pipeline" %}class="active"{% endif %}>Home</li> 

Buena suerte!

+4

Esta es la respuesta correcta. Los otros usan rutas codificadas, lo cual es una muy mala idea. –

+1

Esto solo funciona si usa una ruta por sección de la página. De lo contrario, esto no será lo que estás buscando. = \ – flamusdiu

+0

No, eso no es cierto. Puede tener alguna estructura en sus nombres de punto final (como blueprint.subsection.page) y hacer la comparación usando .startswith ('blueprint.subsection.'). Solo un ejemplo. – negus

3

Trate

<li {% if request.endpoint == "blueprintname.routename" %}class="active"{% endif %}>Home</li> 

Éste trabajó para mí.

1

evitar el uso de URL codificadas puede utilizar la función url_for así:

{% for ni in ['index', 'foo', 'bar', 'baz'] %} 
<li {%- if request.path == url_for(ni) %} class="active"{% endif %}><a href="{{ url_for(ni) }}">{{ ni | capitalize }}</a></li> 
{% endfor %} 

En este caso índice, foo, bar y baz habría nombres de función, que se utiliza como esto en su código Python:

@app.route('/') 
def index(): 
Cuestiones relacionadas