Django模板:将当前网址与{%url xyz%}进行比较

时间:2011-09-29 07:06:03

标签: django django-templates

我正在尝试根据用户所在的当前页面更改导航链接的活动选择。

我正在尝试做这样的事情:

<li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li>

或者,我知道我可以定义这样的事情:

<li class="{% block current %}{% endblock %}"><a href="{% url profile_edit_personal %}">Personal Details</a></li>

并为每个相关模板添加{% block current %}current{% endblock %},但我更喜欢像我在第一个例子中尝试实现的内容,如果可能的话

谢谢!

3 个答案:

答案 0 :(得分:17)

由于您可能只需要执行一次 - 在导航模板中 - 将一切保存在一个地方对我来说更有意义。

首先反转您的网址名称并将其存储在Timmy建议的变量中,然后在模板中进行比较:

{% url 'about_page' as about %}
...

<ul id="nav">
    <li class="{% ifequal request.path about %}active{% endifequal %}"><a href="{{about}}">About</a></li>
...

确保启用了请求上下文处理器,以便您可以访问模板中的请求。通过在django.core.context_processors.debug设置变量中添加TEMPLATE_CONTEXT_PROCESSORS来执行此操作。

答案 1 :(得分:6)

这是一个非常常见的要求,因此编写自己的模板标签来执行此操作可能是值得的:

class isCurrentNode(template.Node):
    def __init__(self, patterns):
        self.patterns = patterns
    def render(self, context):
        path = context['request'].path
        for pattern in self.patterns:
            curr_pattern = template.Variable(pattern).resolve(context)
            if path == curr_pattern:
        return "current"
            return ""

@register.tag
def is_current(parser, token):
    """ Check if the browse is currently at this supplied url"""
    args = token.split_contents()
    if len(args) < 2:
        raise template.TemplateSyntaxError, "%r tag requires at least one argument" % args[0]
    return isCurrentNode(args[1:])

并在您的模板中

{% url about_page as about %}
{% url home_page as home %}
...

<ul>
    <li class="{% is_current home %}"><a href="{{ home }}">Home</a></li>
    <li class="{% is_current about %}"><a href="{{ about }}">About</a></li>
    ...

这个想法略有不同:

http://gnuvince.wordpress.com/2007/09/14/a-django-template-tag-for-the-current-active-page/ http://www.turnkeylinux.org/blog/django-navbar

答案 2 :(得分:3)

怎么样:

<li {% if request.get_full_path == profile_edit_personal.get_absolute_url %}
    class="current"{% endif %}><a href="{% url profile_edit_personal %}">
    Personal Details</a></li>

其中get_absolute_url与Django文档中讨论的一样。

它仍然可能不是自定义活动导航菜单标题的最佳方法,可能有一些CSS技巧可以在没有太多代码的情况下完成。我会说更多,但今天早上只喝了半杯咖啡..