Compare Request.path With A Reversed Url In Django Template
I understand that request.path will give me the current URL. I am currently working on my base.html template with CSS tabs and I want the template to know which tab is currently 'a
Solution 1:
Building on Josh's answer, you can use a simple 'if' tag:
{% url 'orders_list'as orders_list_url %}
<a{% if request.path == orders_list_url %} class="active"{% endif %}
href="{{ orders_list_url }}">Orders</a>
Solution 2:
A better version of the top answer would be to reverse the viewname:
{% url_active 'reverse_viewname' %}
This version doesn't require you to pass in the request
. Instead, we indicate that the tag needs the context and then get the request from that.
from django import template
from django.core.urlresolvers import reverse
register = template.Library()
@register.simple_tag(takes_context=True)defurl_active(context, viewname):
request = context['request']
current_path = request.path
compare_path = reverse(viewname)
if current_path == compare_path:
return'active'else:
return''
Solution 3:
You can use a custom template tag
from django importtemplateregister= template.Library()
@register.simple_tag
def active(request, pattern):
path = request.path
ifpath== pattern:
return'active'return''
Then usage is sort of like this in your template:
{% load my_tags %}
{% url orders_list as orders %}
<li class="{% active request orders %}">
<ahref="{{ orders }}"> Orders </a>
</li>
You can modify the template tag as you wish.
Solution 4:
Inspired by cougar's answer:
$("ul.nav [href='"+window.location.pathname+"']").parents("li").addClass('active');
This solution is plain JS, and works for Bootstrap's navigation bar. For the OP's scenario one can use:
$("[href='"+window.location.pathname+"']").addClass('active-tab');
Solution 5:
A solution with an if-then-else option:
from django import template
from django.template.base import Node, NodeList, TemplateSyntaxError
register = template.Library()
classIfCurrentViewNode(Node):
child_nodelists = ('nodelist_true', 'nodelist_false')
def__init__(self, view_name, nodelist_true, nodelist_false):
self.view_name = view_name
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
def__repr__(self):
return"<IfCurrentViewNode>"defrender(self, context):
view_name = self.view_name.resolve(context, True)
request = context['request']
if request.resolver_match.url_name == view_name:
return self.nodelist_true.render(context)
return self.nodelist_false.render(context)
defdo_ifcurrentview(parser, token):
bits = token.split_contents()
iflen(bits) < 2:
raise TemplateSyntaxError("'%s' takes at least one argument"" (path to a view)" % bits[0])
view_name = parser.compile_filter(bits[1])
nodelist_true = parser.parse(('else', 'endifcurrentview'))
token = parser.next_token()
if token.contents == 'else':
nodelist_false = parser.parse(('endifcurrentview',))
parser.delete_first_token()
else:
nodelist_false = NodeList()
return IfCurrentViewNode(view_name, nodelist_true, nodelist_false)
@register.tagdefifcurrentview(parser, token):
"""
Outputs the contents of the block if the current view match the argument.
Examples::
{% ifcurrentview 'path.to.some_view' %}
...
{% endifcurrentview %}
{% ifcurrentview 'path.to.some_view' %}
...
{% else %}
...
{% endifcurrentview %}
"""return do_ifcurrentview(parser, token)
Post a Comment for "Compare Request.path With A Reversed Url In Django Template"