Django:是否有更好的方式大胆目前的页面的链接
-
06-07-2019 - |
题
我有一个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 模板和设置自己的相应的标题和内容。
我的问题是关于上东西,我有一个class="当前"。
我想让当前的网页,我是在有这类属性。
我可以设置一个不同的变量在每个视像current_page="有关",然后做一比较的模板 {% ifequal %}
在每个类元素中的每一个环节,但是,这似乎是重复工作(因为额外的景变量)。
是否有一个更好的办法?也许,如果有一个方法可以得到查看名字功能的模板是充满自动我就不需要设置额外的可变?此外,它不似乎是一个很大的ifequals.
解决方案
这里有一个优雅的方式来做到这一点,这是我复制的地方,我只希望我能记得,所以我可以给他们的信贷。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
报表 - 增加网页的一部分只是工作[TM]
- 改变了看待事物永远只能意味着改变CSS,没有标记。
我使用的不决,但这个系统工作的任何地方。在你的情况,其中你"自己设定各自的标题和内容"你还需要设置 body id
, 有没有其他决标所必需的。
这个想法很容易地延伸到其他情况为好,例如。"我要下载链接的边栏中的每一页上的,除了下载的页面本身。" 你可以这样做,在CSS这样的:
#section-download #sidebar #download-link {
display: none;
}
而不是把有条件的模板的标记在边栏HTML。
其他提示
没有使用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>
我看到的只有一对夫妇的方式这样做,同时避免重复ifequals:
Javascript。沿线的东西(jQuery):
var parts = window.location.pathname.split('/'); var page = parts[parts.length-1]; $('#sidebar1 a[href*=' + page + ']').addClass('current');
改变你的看法,以包含一系列的网页与其相关的标题和网址,并创建一个{%对%}循环在你的模板,这将通过该列表,并添加一个单一的{%ifequal%}.
备选案文2的最爱从我的立场。如果逻辑对于您的所有网页都是相同的,并且只有所不同模板,可以考虑采用的简单页面模型为每个网页。如果逻辑是不同的,和您需要不同的模式,可以考虑使用一个菜单的应用程序的某种。一个无耻的插件:我有一个 菜单的应用程序的我自己
如果添加 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>