Django:有没有更好的方法来加粗当前页面链接

时间:2009-06-21 15:37:43

标签: django django-templates django-urls

我有一个包含链接列表的base.html模板。

示例:

   <div id="sidebar1">
        <ul>
        <li><a href="/" title="">Index</a></li>
        <li><a href="/stuff/" title="" class="current">Stuff</a></li>
        <li><a href="/about/" title="">About Me</a></li>
        <li><a href="/contact/" title="">Contact Me</a></li>
    </div>

然后我在views.py中定义了index.html,stuff.html,about.html和contact.html。这些模板中的每一个都只是从base.html模板派生而来,并设置各自的标题和内容。

我的问题是关于上面/我有一个类=“当前”的东西。

我想让我所在的当前页面具有该类属性。

我可以在每个视图中设置一个不同的变量,比如current_page =“about”,然后在每个链接的每个类元素中使用{% ifequal %}在模板中进行比较,但这似乎是重复工作(因为额外的观点变量)。

有更好的方法吗?也许如果有一种方法来获取模板自动填充的视图函数名称,我不需要设置额外的变量?它似乎也有很多ifequals。

4 个答案:

答案 0 :(得分:16)

这是一个优雅的方式,我从某处复制,我只希望我能记住在哪里,所以我可以给他们信用。 8 - )

我为每个网页(或某个部分内的所有网页)分配id,如下所示:

In index.html:    <body id='section-intro'>...
In faq.html:      <body id='section-faq'>...
In download.html: <body id='section-download'>...

然后是相应链接的id

<li id='nav-intro'><a href="./">Introduction</a></li>
<li id='nav-faq'><a href="./faq.html">FAQ</a></li>
<li id='nav-download'><a href="./download.html">Download</a></li>

在CSS中我设置了这样的规则:

#section-intro #nav-intro,
#section-faq #nav-faq,
#section-download #nav-download {
    font-weight: bold;
    /* And whatever other styles the current link should have. */
}

因此,这主要以声明方式控制当前页面所属链接的样式。您可以在此处看到它:http://entrian.com/source-search/

一旦你进行了设置,这是一个非常简洁的系统,因为:

  • 您不需要在链接中弄乱模板标记
  • 您最终不会使用大丑switch语句或if / else / else语句
  • 将页面添加到Just Works [TM]
  • 部分
  • 改变事物的外观只会改变CSS,而不是标记。

我没有使用Django,但这个系统可以在任何地方使用。在您的情况下,您“设置各自的标题和内容”,您还需要设置body id,并且不需要其他Django标记。

这个想法也很容易扩展到其他情况,例如。 “除了下载页面本身,我希望每个页面的侧边栏都有一个下载链接。”你可以在CSS中这样做:

#section-download #sidebar #download-link {
    display: none;
}

而不是必须在条形码HTML中放置条件模板标记。

答案 1 :(得分:2)

没有使用过Django,但我在Kohana(PHP)和Rails中处理过相同的问题。

我在Kohana做的事情:

<li><a href="/admin/dashboard" <?= (get_class($this) == 'Dashboard_Controller') ? "class=\"active\"" : NULL ?>>Dashboard</a></li>
<li><a href="/admin/campaigns" <?= (get_class($this) == 'Campaigns_Controller') ? "class=\"active\"" : NULL ?>>Campaigns</a></li>
<li><a href="/admin/lists" <?= (get_class($this) == 'Lists_Controller') ? "class=\"active\"" : NULL ?>>Lists</a></li>

我在Rails中做了什么:

<li><a href="/main" <%= 'class="active"' if (controller.controller_name == 'main') %>>Overview</a></li>
<li><a href="/notifications" <%= 'class="active"' if (controller.controller_name == 'notifications') %>>Notifications</a></li>
<li><a href="/reports" <%= 'class="active"' if (controller.controller_name == 'reports') %>>Reports</a></li>

答案 2 :(得分:1)

我只看到了几种方法,同时避免重复ifequals:

  1. 的Javascript。 (jQuery)的一些东西:

    var parts = window.location.pathname.split('/');
    var page = parts[parts.length-1];
    $('#sidebar1 a[href*=' + page + ']').addClass('current');
    
  2. 更改您的观看次数,以包含包含相关标题和网址的网页列表,并在模板中创建一个{%for%}循环,该循环将遍历该列表,并添加一个{%ifequal%}

  3. 选项2是我最喜欢的地方。如果所有页面的逻辑相同,并且只有模板不同,则可以考虑对每个页面使用FlatPages模型。如果逻辑不同,并且您需要不同的模型,您可以考虑使用某种类型的菜单应用程序。一个无耻的插件:我有menuing app of my own

答案 3 :(得分:1)

如果添加request上下文处理器,则非常简单:

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'django.contrib.auth.context_processors.auth'  # admin app wants this too
)

现在您可以访问包含请求路径的HttpRequest。突出显示当前页面很简单,检查路径是否与链接的目的地匹配,即您已经在那里:

<li><a class="{% if request.path == '/' %}current{% endif %}" href="/">Index</a></li>
<li><a class="{% if request.path == '/stuff/' %}current{% endif %}" href="/stuff/">Stuff</a></li>
<li><a class="{% if request.path == '/about/' %}current{% endif %}" href="/about/">About Me</a></li>
<li><a class="{% if request.path == '/contact/' %}current{% endif %}" href="/contact/">Contact Me</a></li>