/ / Szablony Django - czy mogę ustawić zmienną do użycia w szablonie nadrzędnym? - django, dziedziczenie, szablony, zmienne

Szablony Django - czy mogę ustawić zmienną do użycia w szablonie nadrzędnym? - django, dziedziczenie, szablony, zmienne

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

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