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

问题描述 投票:0回答:3

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

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

<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 %}
但我更喜欢像我在第一个示例中尝试实现的目标(如果可能的话)

谢谢!

django django-templates
3个回答
20
投票

由于您可能只需要在导航模板中执行此操作一次,因此对我来说将所有内容都放在一个地方更有意义。

首先反转你的网址名称并将它们存储在像 Timmy 建议的变量中,然后简单地在模板中比较它们:

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

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

只需确保您启用了请求上下文处理器,以便您可以访问模板中的请求。通过在

django.core.context_processors.debug
设置变量中添加
TEMPLATE_CONTEXT_PROCESSORS
来完成此操作。


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


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 技巧可以做到这一点,而无需太多代码。我想说更多,但今天早上只喝了半杯咖啡..

© www.soinside.com 2019 - 2024. All rights reserved.