Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
{% url 'menu_1' as menu_url_1 %}
{% url 'menu_2' as menu_url_2 %}
{% ifequal request.path menu_url_1 %}menu 1 is active{% endifequal %}
{% ifequal request.path menu_url_2 %}menu 2 is active{% endifequal %}
ifequal? Серьезно?_urls = (
(reverse_lazy('app1.index'), u'App 1'),
(reverse_lazy('app2.index'), u'App 2'),
(reverse_lazy('app3.index'), u'App 3'),
)
@register.inclusion_tag('menu.html', takes_context=True)
def navigation_menu(context):
request = context['request']
urls = []
full_path = request.get_full_path()
for href, name in _urls:
is_current = full_path.startswith(href)
urls.append([href, name, is_current])
return {
'urls': urls,
}
На дворе django 1.6, а вы до сих пор пользуетесь ifequal? Серьезно?
import re
from django import template
register = template.Library()
@register.simple_tag
def active(request, pattern):
if re.search(pattern, request.path):
return 'active'
return ''
{% load navigation %}
... class="first {% active request "^/url1/" %}" ...
... class="{% active request "^/url2/" %}" ...
...
<li class="{%block about%}{%endblock%}"><a href="/">О проекте</a></li>
<li class="{%block search%}{%endblock%}"><a href="/search">Поиск</a></li>
<li class="{%block contacts%}{%endblock%}"><a href="/contact">Обратная связь</a></li>
...
{%block contacts%} active{%endblock%}import re
from django import template
register = template.Library()
@register.simple_tag
def active_tag(request, patterns, out='selected'):
"""
usage:
<a class="url{% active_tag request "default /home/" %}" href="#">url item 1</a>
-> <a class="url seleced">url item 1</a>
<a class="url{% active_tag request "/posts/ /allposts/" "custom-css" %}" href="#">url item 2</a>
-> <a class="url custom-css">url item 2</a>
{% active_tag request '^/account/-/(\w+)/$ ^/account/-/(\w+)/edit/$ ^/account/-/(\w+)/password/$' 'class="selected"'%}
{% active_tag request obj.get_absolute_url %}
"""
if "default" in patterns.split() and request.path == '/':
return " %s" % out
else:
return " %s" % out if len([p for p in patterns.split()
if re.search(p, request.path) ]) else ''
@register.filter
def is_current_page(request, param):
params = param.split(',')
name = params[0]
args, kwargs, as_var = parse_args_and_kwargs(params[1:])
# Do not mix args and kwargs in reverse() - it is forbidden!
if args:
return request.path == reverse(name, args=args)
elif kwargs:
return request.path == reverse(name, kwargs=kwargs)
else:
return request.path == reverse(name)
{% if request|is_current_page:'shop/product,id=1' %} active {% endif %}
Навигация в шаблонах Django