将request.path与Django模板中的反转url进行比较

时间:2012-04-21 22:14:00

标签: python django django-templates

我了解request.path会给我当前的网址。

我目前正在使用CSS标签处理我的base.html模板,我希望模板知道当前哪个标签&#34;有效&#34;并将class="active-tab"传递给<a>代码。

所以我想做一些像

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

但我确定你无法进行if比较。我也只想要基(?)URL忽略任何GET参数。

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

9 个答案:

答案 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>