2010-02-09 17 views
14

Tengo una plantilla principal que contiene un menú de navegación genérico. Deseo poder agregar class="selected" a la opción de menú adecuada.Plantillas de Django: ¿puedo establecer una variable para usar en una plantilla principal?

Quiero ser capaz de establecer una variable en una plantilla de niño, por ejemplo:

{% set menu = "products" %} 

y hacer:

{%ifequal menu "products" %}class="selected"{% endifequal %} 

que no quieren establecer un valor en la vista porque tendría que agregar esto a todos mis métodos de vista, y no quiero repetir todo el html del menú en cada página secundaria porque si el menú cambia, solo quiero cambiar el HTML en un solo lugar.

¿Me estoy acercando a esto desde una "no-Django" mentalidad?

Cualquier ayuda sería muy apreciada. Gracias.

+0

1, también se preguntaban esto (o, alternativamente, se pregunta si se trata de no es una mala práctica). Un efecto similar podría ser saber qué plantilla se llamó – Agos

+0

. Jinja2 es compatible con esto, pero yo también estoy buscando una forma de hacerlo en django. – Gattster

Respuesta

1

¡Aquí hay más de una respuesta, por supuesto!

Puede usar etiquetas de plantilla personalizadas para dibujar el menú y seleccionar el apropiado.

Por lo que su etiqueta de plantilla sería:

{% mymainmenu selecteditem %} 

Tener un vistazo a la documentación etiqueta de plantilla personalizada en el sitio Django, pero terminaría algo como:

@register.simple_tag 
def mymainmenu(selecteditem): 

    html = '' 

    build the html for the menu here and include selected class 

    return html 
+0

Hay más de una respuesta, de hecho, pero esta es la única manera obvia de hacerlo. (¡Aunque puede que no sea obvio al principio!) – jcdyer

9

El contexto se pasar dentro de ti también está disponible en las plantillas que estás ampliando. La adición de un 'menu_class': 'selected' en el contexto, podría configurar

<div id="menu" class="{{ menu_class }}"> 

en la plantilla base.

Otro revés sería

<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}"> 

que luego se puede extender en su plantilla hija por

{% block menu_attrib %}selected{% endblock %} 
+0

Pero no puede repetir ese bloque en la plantilla primaria, ¿verdad? – thomaskonrad

0

Gracias a todos - al final he seguido la propuesta de Speakman y poner el nombre del menú actual opción en el contexto y use mi:

{%ifequal menu "products" %} 
    class="selected" 
{% endifequal %} 

cláusula en cada menú Opton

No creo que esto es una gran solución, se acopla mis 'vistas' a mis 'plantillas' más de lo que hubiera querido ... pero tal vez esto es sólo s Django peculiaridad

+0

Luego presione la marca de verificación junto a la respuesta de Speakman. Por cierto, la gente de Django parece haber evitado intencionalmente que '{% extends%}' establezca variables en valores pasados ​​como una función. –

+0

alguna idea de por qué a los administradores de django no les gusta esto? – Gattster

9

para el registro , que es considera una mala práctica ... pero se puede hacer esto

{% with "products" as menu %} 
    {{ menu }} 
{% endwith %} 

Dado que en realidad no resuelve el problema específico aquí es una posible aplicación ...

<div class='menu'> 
    {% block menuitems %} 
     <a class='{% ifequal menu 'products' %}selected{% endifequal %}' href='/whereever/'>products</a> 
     ... 
    {% endblock %} 
</div> 

y en la plantilla hija

{% block menuitems %} 
    {% with 'products' as menu %} 
     {{ block.super }} 
    {% endwith %} 
{% endblock %} 
+1

Ohh hombre, tu respuesta me salvó el día. Soy nuevo en django pero he utilizado esta característica en otros marcos. Pero ninguna otra respuesta coincidía con mi consulta. –

+0

¡Gracias, muy buena idea! – mrash

Cuestiones relacionadas