Mam szablon nadrzędny, który zawiera ogólne menu nawigacyjne. Chcę móc dodać class="selected"
do odpowiedniej opcji menu.
Chcę mieć możliwość ustawienia zmiennej w szablonie podrzędnym, na przykład:
{% set menu = "products" %}
i robić:
{%ifequal menu "products" %}class="selected"{% endifequal %}
Nie chcę ustawiać wartości w widoku, ponieważ jamusiałbym dodać to do wszystkich moich metod przeglądania, i nie chcę powtarzać całego html menu na każdej stronie podrzędnej, ponieważ jeśli menu się zmieni, chcę zmienić HTML tylko w jednym miejscu.
Czy podchodzę do tego z nastawieniem „innym niż Django”?
Każda pomoc byłaby bardzo mile widziana. dzięki.
Odpowiedzi:
9 dla odpowiedzi № 1Kontekst, który przekazujesz w widoku, jest również dostępny w szablonach, które „rozszerzasz”. Dodając „menu_klasę”: „wybrano” w kontekście, możesz ustawić
<div id="menu" class="{{ menu_class }}">
w szablonie podstawowym.
Innym rozwiązaniem byłoby
<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}">
który następnie można rozszerzyć w szablonie podrzędnym o
{% block menu_attrib %}selected{% endblock %}
9 dla odpowiedzi nr 2
dla przypomnienia, to jest uważane za złą praktykę ... ale możesz to zrobić
{% with "products" as menu %}
{{ menu }}
{% endwith %}
Ponieważ to tak naprawdę nie rozwiązuje konkretnego problemu, możliwe jest zastosowanie ...
<div class="menu">
{% block menuitems %}
<a class="{% ifequal menu "products" %}selected{% endifequal %}" href="/whereever/">products</a>
...
{% endblock %}
</div>
i w szablonie podrzędnym
{% block menuitems %}
{% with "products" as menu %}
{{ block.super }}
{% endwith %}
{% endblock %}
1 dla odpowiedzi nr 3
Oczywiście jest tu więcej niż jedna odpowiedź!
Możesz użyć niestandardowych znaczników szablonu, aby narysować menu i wybrać odpowiedni.
Zatem tag szablonu będzie:
{% mymainmenu selecteditem %}
Zajrzyj do dokumentacji niestandardowego znacznika szablonu na stronie django, ale skończyłoby się to tak:
@register.simple_tag
def mymainmenu(selecteditem):
html = ""
build the html for the menu here and include selected class
return html
0 dla odpowiedzi nr 4
Możesz użyć niestandardowego znacznika szablonu, jak opisano tutaj: http://www.soyoucode.com/2011/set-variable-django-template
0 dla odpowiedzi № 5
Dzięki wszystkim - w końcu zastosowałem się do sugestii speakmana i umieściłem nazwę bieżącej opcji menu w kontekście w i używam mojego:
{%ifequal menu "products" %}
class="selected"
{% endifequal %}
klauzula w każdym optonie menu.
Nie sądzę, że jest to świetne rozwiązanie, łączy moje „widoki” z moimi „szablonami” bardziej, niż bym chciał ... ale może to tylko dziwactwo django