我有一个包含链接列表的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。
答案 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
语句我没有使用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:
的Javascript。 (jQuery)的一些东西:
var parts = window.location.pathname.split('/');
var page = parts[parts.length-1];
$('#sidebar1 a[href*=' + page + ']').addClass('current');
更改您的观看次数,以包含包含相关标题和网址的网页列表,并在模板中创建一个{%for%}循环,该循环将遍历该列表,并添加一个{%ifequal%}
选项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>