8

我知道这request.path会给我当前的 URL。

我目前正在base.html使用 CSS 选项卡处理我的模板,我希望模板知道哪个选项卡当前处于“活动状态”并传递class="active-tab"<a>标签。

所以我想做类似的事情

<a href="{% url orders_list %}"
    {% if request.path = reverse('orders_list') %}
        class="active-tab"
    {$ endif %}
>Orders</a>

但我敢肯定你不能做这样的if比较。我也只想要忽略任何 GET 参数的基本 (?) URL。

任何建议或提示也欢迎。提前致谢!

4

9 回答 9

20

基于 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>
于 2013-06-26T04:21:22.247 回答
4

最佳答案的更好版本是反转视图名称:

{% 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 ''
于 2013-08-04T08:05:31.030 回答
2

您可以使用自定义模板标签

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>

您可以根据需要修改模板标签。

于 2012-04-23T00:28:12.187 回答
2

灵感来自美洲狮的回答:

$("ul.nav [href='"+window.location.pathname+"']").parents("li").addClass('active');

这个解决方案是纯 JS,适用于 Bootstrap 的导航栏。对于 OP 的场景,可以使用:

$("[href='"+window.location.pathname+"']").addClass('active-tab');
于 2013-06-14T21:51:50.030 回答
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)
于 2013-11-10T21:22:00.800 回答
1

您可以request.path = reverse('orders_list')在视图中计算您需要的任何内容(例如)并将结果传递给模板。在视图(python 代码)中,您可以随心所欲地操纵路径。

您可以检查一个 URL 是否是另一个 URL 的前缀。

于 2012-04-21T22:32:38.050 回答
1

试试这个 jQuery 语句:

$("[href='{{ request.path }}']").parents("li").addClass('active');
于 2012-05-24T12:44:45.327 回答
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 ''
于 2013-08-22T20:48:17.337 回答
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>
于 2012-04-22T22:50:25.377 回答