我在类似的错误...上下文中采用了 Jarret Hardie 的“低技术”方法(是的,这是一个双关语...除非我告诉您我没有做导航,否则这对您来说并不完全合理但是设置按钮的边框颜色以显示哪个按钮被按下)。
但我认为我的版本更紧凑一些。我不是在视图中只定义一个简单的上下文变量 activebar,而是返回一个字典,但总是只有一个键值对:例如活动栏 = {'foo': '活动'}。
然后在模板中,我只需将 class="{{activebar.foo}}" 写入 foo 锚点,并相应地写入其他锚点。如果仅将 activebar.foo 定义为具有值“active”,则 bar 锚中的 activebar.bar 将不执行任何操作。也许“默默地失败”是正确的 Django 谈话。 Bob 是你的叔叔。
编辑:哎呀...几天过去了,虽然我上面写的确实对我有用,但当我将一个以新窗口作为目标的锚点放入导航栏中时,出现了一个问题。这似乎是一个奇怪故障的原因:在单击新窗口(Firefox 中的选项卡)然后返回到启动新窗口的窗口后,每当我快速移动将光标悬停在导航栏上的项目上---无需单击任何内容。我不得不通过移动滚动条来强制重绘屏幕(不是重新加载页面,尽管这也很有效,因为它涉及屏幕重绘)。
我太菜鸟了,无法弄清楚为什么会发生这种情况。有可能我做了其他事情导致问题以某种方式消失了。但是......我找到了一种更简单的方法,对我来说非常有效。我的情况是,从视图启动的每个子模板都应该导致关联的导航栏项目显示为“活动”。事实上,导航栏项目是启动子模板的视图的那个项目——通常的交易。
我的解决方案---让我们以“登录”导航栏项目为例---是将其放在包含登录表单的子模板中。
{% block login %}active{% endblock %}
我把它放在标题栏下方,但我认为放置位置并不重要。然后在包含导航栏定义的父模板中,对于围绕我放置的登录导航栏项目的锚点的 li 标记......好吧,这是代码:
<li class="{% block login %}{% endblock %}"><a href="/mysite/login">Login</a></li>
因此,当渲染子模板时,父模板会将登录导航栏项显示为活动的,并且 Bob 仍然是你的叔叔。
我上面描述的字典方法是显示一行按钮中的哪一个被按下,当它们都在同一个子模板上时。这仍然对我有用,因为只涉及一个子模板,我看不出我的导航栏新方法在这种情况下如何工作。请注意,使用导航栏视图的新方法甚至不涉及。更简单!