Django - 根据当前页面突出显示导航?

Gar*_*nzo 38 navigation django

我正在构建一个包含几个主要部分的webapp.每个部分都有几个子部分.我有一个main_nav.html文件,其中包含主要部分的导航.HTML使用模板中的{% include ... %}命令将其添加到基础文件中base.html.此外,我有几个子部分导航文件,每个文件都使用相同的{% include ... %}命令添加到任何给定的页面.

所有导航栏都非常简单,只带有<a href...>标签的文本.

我想强调当前主要部分和当前子部分的链接.由于这个webapp相当大,我希望以某种方式这样做而不添加特定于页面的信息.另外,我希望它随着webapp的扩展而"工作",以包含更多的部分和子部分.例如,可以通过查看正在使用的实际URL来完成吗?我希望将这可以放在导航文件本身内,而不必在每个django视图中加载一些变量或其他内容.

因此,例如,导航看起来像这样:

(main ->)            [Systems][Invoices][Work Orders][Admin]
(system sub-nav ->)  [Owner][Billing][Contacts]
Run Code Online (Sandbox Code Playgroud)

因此,如果我在该Billing部分Systems,我希望链接Systems以粗体显示,链接Billing为粗体(或其他一些简单的突出显示)

要么:

(main ->)                 [Systems][Invoices][Work Orders][Admin]
(Work-Orders sub-nav ->)  [Create New][Outstanding]
Run Code Online (Sandbox Code Playgroud)

如果我在该Outstanding部分Work Orders,则需要突出显示链接Work Orders和链接Outstanding.

有任何想法吗?

Chr*_*att 63

假设你用render_to_responseRequestContext或使用render的Django 1.3基于类的方法或意见,你必须在你的模板中提供的请求对象.从那里,只需访问当前路径并将其与预期值进行比较即可:

<a href="/some/path/to/be/highlighted/"{% if request.path == '/some/path/to/be/highlighted/' %} class="active"{% endif %}>Some Link</a>
Run Code Online (Sandbox Code Playgroud)

在Django 1.3中,我喜欢保存冗余并使用as运算符进行URL查找:

{% url 'some_urlpattern_name' as url %}
<a href="{{ url }}"{% if request.path == url %} class="active"{% endif %}>Some Link</a>
Run Code Online (Sandbox Code Playgroud)

根据需要重复每个链接.

  • 好吧,我想我弄明白了.我必须将这些行添加到我的`settings.py`文件中:`来自django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS`(换行符)`TEMPLATE_CONTEXT_PROCESSORS + =(`(换行符)`'django.core.context_processors.request',)` .我必须承认我并非100%确定我这样做是正确的,但是通过这些行,我现在可以在模板中使用`{{request.get_full_path}}`. (7认同)
  • 对不起。是的,您还需要模板上下文处理器。这是一个一劳永逸的设置,所以我通常会……忘记它;) (2认同)
  • 是否可以进行反向URL查找而不是硬编码搜索路径? (2认同)

sha*_*ker 9

扩展了Chris接受的答案,您可以使用Django模板语言支持in部分匹配的事实.例如,如果你有像这样的URL

/people/directory
/people/profiles/joe
/people/profiles/edit
Run Code Online (Sandbox Code Playgroud)

并且您希望为所有这些情况突出显示主"People"导航元素,请使用以下内容:

{% if "/people/" in request.path %}class="active"{% endif %}
Run Code Online (Sandbox Code Playgroud)


fab*_*pro 6

只是以为我会在其他人的方法中考虑他们是否在Google中找到了这个.

在我的模板中,我有这样的事情:

{% block pagename %}homepage{% endblock %}
Run Code Online (Sandbox Code Playgroud)

然后在我的主模板中,这样的东西(以便继承模板的页面名称可用于呈现的页面):

<span id="_pageName" style="display:none">{% block pagename %}{% endblock %}</span>
Run Code Online (Sandbox Code Playgroud)

我的链接看起来像这样:

<li data-link-name="homepage"><a href="{% url "pages:home" %}">Home</a></li>
Run Code Online (Sandbox Code Playgroud)

您只需要一些javascript就可以在页面加载时将CSS类应用到正确的链接.我看起来像这样:

$(function() {
    var pageName = document.getElementById('_pageName');
    if (pageName != null) { pageName = pageName.innerHTML; }
    else { pageName = ''; }
    if (pageName.length > 0) {
        $("li[data-link-name='" + pageName + "']").addClass('active');
    }
});
Run Code Online (Sandbox Code Playgroud)

非常简单,通过在模板中添加一个小块,可以控制要突出显示的链接.