我了解request.path
会给我当前的网址。
我目前正在使用CSS标签处理我的base.html
模板,我希望模板知道当前哪个标签"有效"并将class="active-tab"
传递给<a>
代码。
所以我想做一些像
这样的事情<a href="{% url orders_list %}"
{% if request.path = reverse('orders_list') %}
class="active-tab"
{$ endif %}
>Orders</a>
但我确定你无法进行if
比较。我也只想要基(?)URL忽略任何GET参数。
欢迎任何建议或提示。提前谢谢!
答案 0 :(得分:11)
根据Josh的回答,您可以使用简单的“if”标签:
{% url 'orders_list' as orders_list_url %}
<a{% if request.path == orders_list_url %} class="active"{% endif %}
href="{{ orders_list_url }}">Orders</a>
答案 1 :(得分:3)
您可以使用custom template tag
from django import template
register = template.Library()
@register.simple_tag
def active(request, pattern):
path = request.path
if path == pattern:
return 'active'
return ''
然后在你的模板中使用类似的东西:
{% load my_tags %}
{% url orders_list as orders %}
<li class="{% active request orders %}">
<a href="{{ orders }}"> Orders </a>
</li>
您可以根据需要修改模板标记。
答案 2 :(得分:3)
最佳答案的更好版本是反转视图名称:
{% url_active 'reverse_viewname' %}
此版本不要求您传递request
。相反,我们指出标签需要上下文,然后从中获取请求。
from django import template
from django.core.urlresolvers import reverse
register = template.Library()
@register.simple_tag(takes_context=True)
def url_active(context, viewname):
request = context['request']
current_path = request.path
compare_path = reverse(viewname)
if current_path == compare_path:
return 'active'
else:
return ''
答案 3 :(得分:2)
受到美洲狮答案的启发:
$("ul.nav [href='"+window.location.pathname+"']").parents("li").addClass('active');
此解决方案是普通的JS,适用于Bootstrap的导航栏。对于OP的场景,可以使用:
$("[href='"+window.location.pathname+"']").addClass('active-tab');
答案 4 :(得分:2)
使用if-then-else选项的解决方案:
from django import template
from django.template.base import Node, NodeList, TemplateSyntaxError
register = template.Library()
class IfCurrentViewNode(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>"
def render(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)
def do_ifcurrentview(parser, token):
bits = token.split_contents()
if len(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.tag
def ifcurrentview(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)
答案 5 :(得分:1)
您可以在视图中计算所需的任何内容(例如request.path = reverse('orders_list')
),并将结果传递给模板。在视图(python代码)中,您可以根据需要操作路径。
您可以检查一个网址是否是另一个网址的前缀。
答案 6 :(得分:1)
试试这个jQuery语句:
$("[href='{{ request.path }}']").parents("li").addClass('active');
答案 7 :(得分:1)
用法:{% url_active "home" "other-view" "and-so-on" success="active-specific-class" %}
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def url_active(context, *args, **kwargs):
if 'request' not in context:
return ''
request = context['request']
if request.resolver_match.url_name in args:
return kwargs['success'] if 'success' in kwargs else 'active'
else:
return ''
答案 8 :(得分:0)
我在jQuery中找到了一个被黑客攻击的方法......但我仍然愿意接受更好的解决方案。
jQuery的:
var tab_list = {
'orders-tab' : '{% url orders_list %}',
'users-tab' : '{% url users_list %}',
'vendors-tab': '{% url vendors_list %}',
'places-tab' : '{% url places_list %}'
}
$(document).ready(function() {
for(var property in tab_list) {
if('{{ request.path }}' == tab_list[property]) {
$('#' + property).addClass('active-tab')
break
}
}
})
HTML:
<ul id="tabs" class="fl">
<li><a href="#" id="dashboard-tab" class="dashboard-tab">Dashboard</a></li>
<li><a href="{% url orders_list %}" id="orders-tab">Orders</a></li>
<li><a href="{% url users_list %}" id="users-tab">Users</a></li>
<li><a href="{% url vendors_list %}" id="vendors-tab">Vendors</a></li>
<li><a href="{% url places_list %}" id="places-tab">Places</a></li>
</ul>